工厂方法笔记

定义

结构

例子

现在有一个披萨店对象,有三种披萨对象:PizzaA PizzaB PizzaC,都是Pizza 的子类. 披萨店有点餐方法.

public class Pizza {
    void prepare(){
        System.out.println("preparing...");
    }

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

    void cut(){
        System.out.println("cutting...");

    }

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

    }
}
public class PizzaA extends Pizza {
    String name="A";
}

public class PizzaB extends Pizza{
    String name="B";

}

public class PizzaC extends Pizza{
    String name="C";
}
public class PizzaStore {
    public static void main(String[] args) {
        PizzaStore store = new PizzaStore();
        Pizza pizza = store.orderPizza("A");
    }
    //点一个Pizza
    public Pizza orderPizza(String type){
        Pizza pizza = null;
        if(type.equals("A"))
            pizza = new PizzaA();
        else if(type.equals("B"))
            pizza = new PizzaB();
        else if(type.equals("C"))
            pizza = new PizzaC();


        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return null;
    }
}


Pizza类和PizzaStore现在是紧耦合,试着将 new对象语句抽出到一个方法里,就是简单工厂方法.

package FactoryMethod;

public class PizzaStore {
    public static void main(String[] args) {
        PizzaStore store = new PizzaStore();
        Pizza pizza = store.orderPizza("A");
    }
    public Pizza simpleFactory(String type){
        Pizza pizza = null;
        if(type.equals("A"))
            pizza = new PizzaA();
        else if(type.equals("B"))
            pizza = new PizzaB();
        else if(type.equals("C"))
            pizza = new PizzaC();
        return pizza;
    }
    //点一个Pizza
    public Pizza orderPizza(String type){
        Pizza pizza =simpleFactory(type);

        System.out.println(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return null;
    }
}

但方法现在仍然在这个类中,还是存在耦合,创建接口,实现工厂方法.
new 对象产生的耦合被消除了.

public class PizzaFactory extends  FactoryMethod {
    Object factoryMethod(String type) {
        Pizza pizza = null;
        if (type.equals("A"))
            pizza = new PizzaA();
        else if (type.equals("B"))
            pizza = new PizzaB();
        else if (type.equals("C"))
            pizza = new PizzaC();
        return pizza;
    }
}

public class PizzaStore {
    FactoryMethod factory;
    public static void main(String[] args) {
        PizzaStore store = new PizzaStore();
        Pizza pizza = store.orderPizza("A");
    }

    public PizzaStore(FactoryMethod factory){
        this.factory=factory;
    }
  
    //点一个Pizza
    public Pizza orderPizza(String type){
        Pizza pizza =(Pizza)factory.factoryMethod(type);

        System.out.println(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return null;
    }
}
posted @ 2020-03-07 17:39  少年留不住  阅读(197)  评论(0编辑  收藏  举报