Patrón de diseño de Java ------ patrón de fábrica ------- patrón de método de fábrica

Patrón de método de fábrica

Primero veamos un requisito: cuando los clientes piden pizza, pueden pedir diferentes sabores de pizza, como pizza de queso Henan, pizza de pimiento de Henan o pizza de queso de Londres, pizza de pimiento de Londres.

Ideas

Idea 1 : Use el patrón de fábrica simple para crear diferentes clases de fábrica simples , como HNPizzaSimpleFactory,
LDPizzaSimpleFactory, etc. Desde el caso actual, también es posible, pero considerando la escala del proyecto, así como la mantenibilidad y escalabilidad del software No es particularmente bueno

Idea 2 : usa el patrón del método de fábrica

Introducción al patrón del método de fábrica

Esquema de diseño de patrón de método de fábrica : abstraiga la función de instanciación del proyecto de pizza en un método abstracto e impleméntelo en diferentes subclases de orden de sabor.

Patrón de método de fábrica : define un método abstracto para crear un objeto, y la subclase determina la clase a instanciar . El patrón del método de fábrica difiere la instanciación de objetos a subclases.

Diagrama de clase

Inserte la descripción de la imagen aquí

Nuestro modelo de fábrica simple es crear instancias de objetos directamente en la fábrica , y el modelo de método de fábrica es dar la autoridad para crear objetos a sus subclases , HNOrderPizz (Henan Pizza) y LNOrderPizza (London Pizza)

Código

Entidad pizza

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/21 20:06
 * @Description TODO
 * @pojectname 披萨抽象类    设置为抽象类
 */
public abstract class Pizza {
    
    
    //披萨名字
    protected String name;
    //抽象方法 准备原材料  不同的披萨,原材料是不同的
    //因此做成抽象方法
    public abstract void prepare();
    //其他方法,我们人为流程是差不多的所以就是普通方法
    public void bake(){
    
    
        System.out.println(name+"baking;");
    }

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

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

4 subcategorías de pizza de Henan y pizza de Londres

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/25 20:47
 * @Description TODO
 * @pojectname 河南奶酪代码
 */
public class HNCheesePizza extends Pizza{
    
    
    @Override
    public void prepare() {
    
    
        setName("河南的奶酪披萨");
        System.out.println("给河南奶酪披萨准备原材料");
    }
}
/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/25 20:49
 * @Description TODO
 * @pojectname 河南胡椒代码
 */
public class HNPepperPizza extends  Pizza {
    
    
    @Override
    public void prepare() {
    
    
        setName("河南的胡椒披萨");
        System.out.println("给河南胡椒披萨准备原材料");
    }
}
/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/25 20:47
 * @Description TODO
 * @pojectname 伦敦奶酪代码
 */
public class LDCheesePizza extends Pizza{
    
    
    @Override
    public void prepare() {
    
    
        setName("伦敦的奶酪披萨");
        System.out.println("给伦敦奶酪披萨准备原材料");
    }
}
伦敦胡椒披萨也如此

OrderPizza código de pedido

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/21 20:14
 * @Description TODO
 * @pojectname 订购披萨代码
 */
public abstract class OrderPizza {
    
    
    //定义一个抽象方法createPizza,让各个工厂子类自己实现
    abstract Pizza createPizza(String orderType);
    //构造器
    public OrderPizza(){
    
    
        Pizza pizza = null;
        String orderType ;//orderType用户输入pizza类型
        do {
    
    
            orderType = getType();//获取用户订购的pizza类型
            System.out.println(orderType);
            pizza = createPizza(orderType);//抽象方法,实际上又工厂子类完成
            //输出制作pizza信息
            //订购成功
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while(true);
    }
    //获取客户订购的披萨种类
    private String getType(){
    
    
        try {
    
    
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza 种类:");
            String str = strin.readLine();
            return str;
        } catch (IOException e) {
    
    
            e.printStackTrace();
            return "";
        }
    }
}

Dos subclases de OrderPizza

/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/25 20:56
 * @Description TODO
 * @pojectname 河南披萨订单代码
 */
public class HNOrderPizza extends OrderPizza {
    
    
    @Override
    Pizza createPizza(String orderType) {
    
    
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
    
    
            pizza = new HNCheesePizza();
        }else if (orderType.equals("pepper")){
    
    
            pizza = new HNPepperPizza();
        }
        return pizza;
    }
}
/**
 * @author 王庆华
 * @version 1.0
 * @date 2020/12/25 20:56
 * @Description TODO
 * @pojectname 伦敦披萨代码
 */
public class LDOrderPizza extends OrderPizza {
    
    
    @Override
    Pizza createPizza(String orderType) {
    
    
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
    
    
            pizza = new LDCheesePizza();
        }else if (orderType.equals("pepper")){
    
    
            pizza = new LDPepperPizza();
        }
        return pizza;
    }
}
public class PizzaStore {
    
    
    public static void main(String[] args) {
    
    
        //创建河南口味的各种方法
        new HNOrderPizza();
    }
}
根据我们new的种类,我们就能得到不同的结果
input pizza 种类:
cheese
cheese
给河南奶酪披萨准备原材料
河南的奶酪披萨baking;
河南的奶酪披萨cutting;
河南的奶酪披萨boxing
input pizza 种类:
pepper
那我们要是 new LDOrderPizza();
那么输出的都是有关伦敦披萨的口味

para resumir

Resumamos de nuevo en nuestra. Sencillo modelo de fábrica, nuestra idea es que deje directamente a nuestra clase para OrderPizza , de acuerdo a los diferentes gustos OrderType, a nuevo un sabor diferente de la pizza , y nuestro modelo de fábrica método es como esto : En nuestro modelo de fábrica de método, nuestra clase de pedido OrderPizza está escrita como una clase abstracta con el método abstracto createPiiza () . Este método abstracto se utiliza para crear objetos de instancia de pizza, pero es un método abstracto , por lo que nuestro pedido de pizza Henan y los pedidos de pizza de Londres deben heredar la clase principal OrderPizza . Es decir , distribuimos la tarea de crear objetos de instancia a diferentes subclases . Las subclases son originalmente diferentes, y naturalmente pueden hacer pizzas de diferentes lugares, y luego después de que las subclases crean diferentes sabores de pizza en diferentes lugares, volver a nuestra clase principal OrderPizza , y luego nuestra clase principal genera la información correspondiente

Supongo que te gusta

Origin blog.csdn.net/qq_22155255/article/details/111708904
Recomendado
Clasificación