工厂模式-工厂方法模式


工厂模式-工厂方法模式

看一个新的需求

披萨项目新的需求:客户在点披萨时,可以点不同b风味的披萨,比如北京的奶酪pizza,北京的胡椒pizza,伦敦的胡椒pizza,或者伦敦的奶酪披萨

思路一:

使用简单工厂模式,创建不同的工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory等等。从当前的这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可拓展性并不是特别好。

思路二:

使用工厂方法模式

将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现

工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法将对象的实例化推迟到子类

类图

image-20220711164248705

目录结构:

image-20220711161951259

代码:

Pizza及其子类

public abstract class Pizza {
    //pizza的名字
    protected String name;

    //准备原材料,不同pizza的原材料不一样,因此做成抽象方法
    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;
    }
}
public class BJCheesePizza extends Pizza{
    @Override
    public void prepare() {
        setName("北京的奶酪披萨");
        System.out.println(this.name+"~准备原材料");
    }
}
public class BJPepperPizza extends Pizza{
    @Override
    public void prepare() {
        setName("北京的胡椒披萨");
        System.out.println(this.name+"~准备原材料");
    }
}
public class LDCheesePizza extends Pizza{
    @Override
    public void prepare() {
        setName("伦敦的奶酪披萨");
        System.out.println(this.name+"~准备原材料");
    }
}
public class LDPepperPizza extends Pizza{
    @Override
    public void prepare() {
        setName("伦敦的胡椒披萨");
        System.out.println(this.name+"~准备原材料");
    }
}

工厂类:OrderPizza及其子类

public abstract class OrderPizza {
    //构造器
    public OrderPizza(){
        Pizza pizza = null;
        String orderType;
        do{
            orderType = getType();
            pizza = createPizza(orderType);//抽象方法,由工厂子类完成

            //输出pizza的制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);
    }

    //定义一个抽象方法,让各个工厂的子类自己实现
    abstract Pizza createPizza(String orderType);

    private String getType(){
        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 "";
        }
    }
}
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 BJOrderPizza extends OrderPizza{
    @Override
    Pizza createPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")){
            pizza = new BJCheesePizza();
        }else if (orderType.equals("pepper")){
            pizza = new BJPepperPizza();
        }

        return pizza;
    }
}

运行:

public class PizzaStore {
    public static void main(String[] args) {
        String loc = "bj";//修改地点
        if (loc.equals("bj")){
            //创建北京口味的各种披萨
            new BJOrderPizza();
        }else {
            //创建伦敦口味的各种披萨
            new LDOrderPizza();
        }
    }
}

运行结果:

image-20220711162415990

image-20220711162421857


Author: qwq小小舒
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source qwq小小舒 !
  TOC