设计模式--工厂方法模式

应用案例:客户点披萨时,可以点不同地点、不同口味的披萨,比如北京的奶酪披萨、北京的胡椒披萨 或者伦敦的奶酪披萨、伦敦的胡椒披萨
相比于简单工厂模式的案例,多了一个维度条件,直接使用简单工厂模式的话,会导致多个简单工厂类中有大量重复的代码,这里相当于使用了一个模版方法模式,抽取重复的部分到父类,而抽象一个方法教给子类去实现
披萨父类:
public class Pizza  {

    private String name = "";

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

    public void prepare(){

    }

    public void bake(){
     System.out.println(name + " 烧烤中。。。");
    }

    public void cut(){
        System.out.println(name + " 切割。。。");
    }

    public void box(){
        System.out.println(name + " 打包。。。");
    }
}
伦敦胡椒披萨:
public class LDPepperPizza extends Pizza {
    @Override
    public void prepare() {
        super.prepare();
        System.out.println("伦敦胡椒披萨,准备中。。。");
    }
}
伦敦起司披萨
public class LDCheesePizza extends Pizza {
    @Override
    public void prepare() {
        super.prepare();
        System.out.println("伦敦奶酪披萨,准备中。。。");
    }
}
北京起司披萨
public class BJCheesePizza extends Pizza {
    @Override
    public void prepare() {
        super.prepare();
        System.out.println("北京奶酪披萨,准备中。。。");
    }
}
北京胡椒披萨
public class BJPepperPizza extends Pizza {
    @Override
    public void prepare() {
        super.prepare();
        System.out.println("北京胡椒披萨,准备中。。。");
    }
}

抽象方法工厂类

public abstract class PizzaMethodFactory {
    //定义一个抽象方法,createPizza , 让各个工厂子类自己实现
    abstract Pizza orderPizza(String orderType);
  
  	// 各个子类公用方法
    public createPizza(String orderType) {
        Pizza pizza = null;
       //抽象方法,由工厂子类完成
        pizza = orderPizza(orderType); 
        if (pizza != null){
           //输出 pizza 制作过程
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }else{
            System.out.println("订购失败。。");
        }
    }
}
北京披萨工厂
public class BJPizzaFactory extends PizzaMethodFactory {
    @Override
    Pizza orderPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
            pizza = new BJCheesePizza();
        } else if (orderType.equals("pepper")) {
            pizza = new BJPepperPizza();
        }
        return pizza;
    }
}
伦敦披萨工厂
public class LDPizzaFactory extends PizzaMethodFactory {
    @Override
    Pizza orderPizza(String orderType) {
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
            pizza = new LDCheesePizza();
        } else if (orderType.equals("pepper")) {
            pizza = new LDPepperPizza();
        }
        return pizza;    
    }
}
用法:
    public static void main(String args[]){
        PizzaMethodFactory bjMethodFactory = new BJPizzaFactory();
        bjMethodFactory.createPizza("cheese");
    }
posted @ 2021-09-30 19:05  明月照江江  阅读(46)  评论(0编辑  收藏  举报