La cabeza primero Diseño Patterns-- patrón simple fábrica (fábrica estática)

En este artículo, un conocimiento básico de los diagramas de clase UML, si no son claras puede referirse a:

UML forma correcta de comer ---- solución positiva! !

Cuando una instancia de un objeto, el primer pensamiento es que los nuevos objetos, ninguna casa, una nueva, sin novia, una nueva y aún más buena. Se establece el objeto entre la nueva clase y la relación de acoplamiento, si hay una gran cantidad de objetos, entre clases y objetos para formar un acoplamiento fuerte, deteriora la flexibilidad, por lo que, en general, nos enfrentamos en el proceso de desarrollo "interfaz" programación a través de polimorfismo, esta interfaz puede implementarse con cualquier nueva clase. Sin embargo, el mismo código es demasiado grande, se obtiene que funcione! Así que además de nuevo no tendrá ninguna otra manera de hacerlo? Esto implica el diseño de patrones de diseño:

Los usuarios especifican el tipo que se creen en la clase de prueba:

Nos fijamos en el diagrama de clases:
Aquí Insertar imagen Descripción

Descripción: Clase de pizza es una clase abstracta, entonces hereda pizza CheesePizza y ClamPizza clase y reemplazar el método preparar, a continuación, para crear la función especificada en el tipo de pizza en planta sencilla SimpleFactory y luego se combinan en PizzStore en SimpleFactory, lo que el usuario quiere Pizza, en PizzaStore dice entonces que SimpleFactory hacer un tipo específico, que en sí es no preocuparse de qué tipo de pizza. Cualquiera que sea la última pizza debe hornear, corte, operación caja, después de SimpleFactory terminó de crear Pizza, PizzaStore hornear aplicación, corte, caja. Por supuesto, habrá estudiantes preguntan, si añadimos una especie de pizza, entonces podemos añadir SimpleFactory para entrar, hacer el principio "abierta para la extensión, pero cerrado para la modificación" ocp un bocado! Echemos un vistazo al proceso de aplicación específica

  • Pizza
public abstract class Pizza {

    private String name;
    public abstract void prepare();

    public void bake(){
        System.out.println(name+ "  "+ "backing");
    }
    public void cut(){
        System.out.println(name+ "  "+ "cutting");
    }
    public void box(){
        System.out.println(name+ "  "+ "boxing");
    }

    public void setName(String name) {
        this.name = name;
    }

}
  • ClamPizza
public class ClamPizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("加入ClamPizza调料");
    }
}
  • Pizza de queso
public class CheesePizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("加入CheesePizza调料");
    }
}

  • SimpleFactory
public  class SimpleFactory {

    public Pizza createPizza(String type){
        Pizza pizza = null;

        if (type.equals("Clam")){
            pizza = new ClamPizza();
            pizza.setName(type);
        }else if (type.equals("Cheese")){
            pizza = new CheesePizza();
            pizza.setName(type);
        }
        return pizza;
    }
}
  • PizzaStore
public class PizzaStore {

    SimpleFactory simpleFactory;

    public void setSimpleFactory(SimpleFactory simpleFactory) {
        this.simpleFactory = simpleFactory;
    }

    public Pizza orderPizza(String type, SimpleFactory simpleFactory){
        Pizza pizza;

        pizza = simpleFactory.createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;

    }
}
  • TestPizza
public class TestPizza {
    public static void main(String[] args) {

        //新建一个PizzaStore用来卖Pizza
        PizzaStore pizzaStore = new PizzaStore();

        //传入要买的类型,并且要有一个工厂
        pizzaStore.orderPizza("Clam",new SimpleFactory());
    }
}
  • resultados de la prueba
    Aquí Insertar imagen Descripción

El tipo de usuarios de la consola para crear la entrada dinámica:

1) Hay dos tipos de pizza: Pizza, Grecia (griego), pizza de queso (queso)
2) la producción de pizza BAK, de corte, la caja;
3) Teniendo en cuenta un tipo de proceso de creación de la pizza

  • Pizza
//定义一个抽象的披萨类
public abstract  class Pizza {
	
	//抽象方法
    public abstract void prepare();

	//制做的工艺
    public void bake() {
        System.out.println("baking;");
    }

    public void cut() {
        System.out.println("cuting;");
    }

    public void box() {
        System.out.println("boxing;");
    }

}
  • CheesePizza2
public class CheesePizza2 extends Pizza {
    @Override
    public void prepare() {
        System.out.println("给奶酪披萨准备原材料");
    }
}

  • GreekPizza2
public class GreekPizza2 extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给希腊披萨准备原材料");
    }
}

  • orderPizza2
public class orderPizza2 {

    Pizza pizza = null;

    public Pizza orderPizza(String orderType){

        if (orderType.equals("greek")){
            pizza = new GreekPizza2();
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza2();
        }

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;

    }
}

  • PizzaStore
public class PizzaStore {
    public static void main(String[] args) {

        orderPizza2 orderPizza2 = new orderPizza2();
        orderPizza2.orderPizza("greek");
        orderPizza2.orderPizza("cheese");

    }
}
  • prueba

Aquí Insertar imagen Descripción

  • Hay diagramas de clases
    Aquí Insertar imagen Descripción

Si bien nos damos cuenta de la función, pero cuando se añade un tipo de pizza, que es necesaria en orderPizza2 complemento, si podemos orderPizza2 el interior sacado de acuerdo con el nombre del método para crear un tipo de pizza, un nuevo método, diseñado para crear un objeto, y luego se polimeriza dentro orderPizza2 esta nueva forma de hacer esto, será abierta para la extensión, pero cerrado por modificaciones para cumplir con los principios OCP, siguió adelante!

  • Pizza
public abstract  class Pizza {

    public abstract void prepare();

    public void bake() {
        System.out.println("baking;");
    }

    public void cut() {
        System.out.println("cuting;");
    }

    public void box() {
        System.out.println("boxing;");
    }

}
  • CheesePizza2
public class CheesePizza2 extends Pizza {
    @Override
    public void prepare() {
        System.out.println("经制做奶酪披萨准备原材料");
    }
}
  • GreekPizza2
public class GreekPizza2 extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给希腊披萨准备原材料");
    }
}

  • SimpleFactory2
public class SimpleFactory2 {

    public Pizza createPizza(String orderType){

        Pizza pizza = null;

        if (orderType.equals("greek")){
            pizza = new GreekPizza2();
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza2();
        }

        return pizza;
    }

}
  • OrderPizza2
//定义一个生成厂商,对传入的某种披萨进行prepare,bake,cut,box操作
public class orderPizza2 {

    SimpleFactory2 simpleFactory2;

    Pizza pizza = null;

    public orderPizza2(SimpleFactory2 simpleFactory2) {
        setSimpleFactory2(simpleFactory2);
    }

    public void  setSimpleFactory2(SimpleFactory2 simpleFactory2) {

        this.simpleFactory2 = simpleFactory2;

        //获取披萨的类型是什么
        String orderType = " ";
        orderType = getype();

        pizza = simpleFactory2.createPizza(orderType);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

    }

    //写一个方法,可以获取客户端希望订购的披萨种类
    private String getype(){
        try {
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input Pizza type:");
            String str = strin.readLine();
            return str;
        }catch (IOException e){
            e.printStackTrace();
            return "";
        }
    }
}
  • PizzaStore
public class PizzaStore {

    public static void main(String[] args) {

        new orderPizza2(new SimpleFactory2());
    }
}
  • resultado

Aquí Insertar imagen Descripción

  • clase figura representa
    Aquí Insertar imagen Descripción

En el caso de la pizza, utilizamos una fábrica para crear la pizza Dependiendo del tipo, damos cuenta de la preparación, cocción, corte, caja operación OrderPizza2 dentro, si desea agregar un nuevo tipo de pizza, justo a la clase de fábrica unirse método, otros códigos no cambian, logrando así el objetivo de simplificar el código!

En este artículo, un conocimiento básico de los diagramas de clase UML, si no son claras puede referirse a:

UML forma correcta de comer ---- solución positiva! !

Si le parece que es un problema que se puede escribir en el área de comentarios!

Publicado 47 artículos originales · ganado elogios 34 · vistas 8862

Supongo que te gusta

Origin blog.csdn.net/weixin_42893085/article/details/105309872
Recomendado
Clasificación