Head First-设计模式-简单工厂模式

简单工厂模式:就是一个创建对象的工厂,我要什么你就给我生产什么。

实例:pizza店提供四种披萨,分别为veggiePizza(蔬菜披萨)、pepperoniPizza(蒜香pizza)、clamPizza(蛤蜊pizza)、cheesePizza(芝士pizza),pizza店创建一个工厂,顾客订什么pizza工厂就生产什么pizza给pizza店。


1.先来定义PizzaStore类 定义了做pizza的整套流程

class PizzaStore{//作为接口   定义做pizza一套流程,具体差异子类实现去重写
    //成员变量
     String name;//pizza种类
     double price;//价格  
     String dough;//面团
     String sauce;//调料
     //成员函数
     public void  prepare(){//准备
         System.out.println("prepareing "+name);
         System.out.println("Tossing dough...");
         System.out.println("add topping。。。");
     }
     public void bake(){//烘烤
         System.out.println("bake for half an hour ");
     }
     public void cut(){//切
         System.out.println("cutting the pizza into diagonal slices ");
     }
     public void box(){//装盒
         System.out.println("place pizza in official pizzastore box ");
     }

    public  void print(){//打印一下点了啥
        System.out.println("您好,您点了"+name+", 一共"+price+"$");
    }
    //订披萨
    public PizzaStore orderPizza(String type){
        PizzaStore pizza;
        SimplePizzaFactory factory  = new SimplePizzaFactory();
        pizza = factory.createPizza(type);  //1.确定哪种pizza  重点就在这呢,创建类的实例代码被封装到工厂里,我传给你个类型,你创建好具体对象给我
        pizza.prepare();//2.准备
        pizza.bake();//3.烘焙
        pizza.cut();//4.切块
        pizza.box();//5.打包拿走
        pizza.print();//6.显示订了啥
        return pizza;
    }
}

2.定义生成pizza的简单工厂类SimplePizzaFactory

class SimplePizzaFactory{
    public PizzaStore createPizza(String type){//创建pizza时传入类型,根据类型决定创建哪个pizza的对象
        PizzaStore pizza = null;
        if(type.equals("Cheese")){
            pizza = new CheesePizza();//创建芝士pizza对象 向上转型
        }else if(type.equals("clam")){
            pizza = new ClamPizza();//创建蛤蜊pizza对象
        }else if(type.equals("pepperoni")){
            pizza = new PepperoniPizza();//创建蒜香pizza对象
        }else if(type.equals("veggie")){
            pizza = new VeggiePizza();//创建蔬菜pizza对象
        }
        return pizza;
    }
}

3.现在来写具体种类的pizza类

class CheesePizza extends PizzaStore{//具体pizza类

    public CheesePizza(){
        name = "cheesePizza";
        price = 3.3;
        dough = "面团团团团团";
        sauce = "酱酱酱酱酱酱酱";
    }
}
class ClamPizza extends PizzaStore{//蛤蜊pizza
    public ClamPizza(){
        name = "clamPizza";
        price = 4.4;
        dough = "面团团面团团";
        sauce = "酱酱酱酱酱酱";
    }
}
class PepperoniPizza extends PizzaStore{//蒜香pizza
    public PepperoniPizza(){
        name = "pepperoniPizza";
        price = 5.5;
        dough = "面团面团";
        sauce = "酱紫";
    }
}
class VeggiePizza extends PizzaStore{//蔬菜pizza 
    public VeggiePizza(){
        name = "VeggiePizza";
        price = 6.6;
        dough = "面main面";
        sauce = "酱紫酱紫";
    }
}

4.好了,来点pizza吧

PizzaStore pizza = new PizzaStore();//首先找到pizza店
pizza.orderPizza("pepperoni");//然后订你想要的那种pizza就行了
System.out.println("---------------------------------------");
pizza.orderPizza("veggie");

运行结果:
prepareing clamPizza
Tossing dough…
add topping。。。
bake for half an hour
cutting the pizza into diagonal slices
place pizza in official pizzastore box
您好,您点了clamPizza, 一共4.4$

prepareing pepperoniPizza
Tossing dough…
add topping。。。
bake for half an hour
cutting the pizza into diagonal slices
place pizza in official pizzastore box
您好,您点了pepperoniPizza, 一共5.5$


特点

1 它是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。

2 create()方法通常是静态的,所以也称之为静态工厂。

缺点

1 扩展性差(我想增加一种pizza,除了新增一个pizza产品类,还需要修改工厂类方法)

2 不同的产品需要不同额外参数的时候 不支持。

你可能感兴趣的:(Head First-设计模式-简单工厂模式)