工厂模式有以下几种形态:
① 简单工厂(Simple Factory)
② 工厂方法(Factory Method)
③ 抽象工厂(Abstract Factory)
今天主要了解了一下Simple Factory,不多说什么了,用代码说话:)
一下例子参考head first design pattern:
Pizza orderPizza{
Pizza pizza =- new Pizza();
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
看到上面的代码大家觉得挺好的呀,没什么问题,我需要一个pizza类,我就创建了一个它的实例,调用它的一些犯法返回了这个实例对象。
可是接下来问题出现了,客人要求有很多种不同的pizza,你想着好办,我就给他加个参数啊:)
Pizza orderPizza(String type){
Pizza pizza ;
if(type.equls("cheese")){
pizza = new CheesePizza();
}else if(type.equls("greek")){
pizza = new GreekPizza();
}else if(type.equals("pepperoni"){
pizza = new PepperoniPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
这个时候你很开心的说,怎么样我完成了你需要的,但是当我们要添加新种类的Pizza的时候会出现什么问题,需要添加和修改orderPizza方法,你想那我就加啊,反正也就修改这个方法,也不会太麻烦。如果仅仅有一个方法或者类需要Pizza的话这么做确实不麻烦,但是当我们有很多类需要Pizza的时候会出现什么问题,比如PizzaShop中我们需要点Pizza,可能需要它的价格或者描述,这个时候我们需要一个Pizza实例,有可能我们还有一个运送Pizza的类需要Pizza实例,这个时候我们就需要在三个地方作出修改,在大的系统中可能更多。
在这个时候Simple Factory起作用了,因为我们已经知道了那一部分是可变的,这个时候我们就可以把这个可变的部分封装起来:)
public class SimplePizzaFactory{
public Pizza createPizza(String type){
if(type.equals("cheese")){
pizza = new CheesePizza();
}else if(type.equals("pepperoni")){
pizza = new PepperoniPizza();
}else if(type.equals("clam")){
pizza = new ClamPizza();
}else if(type.equals("veggie")){
pizza = new VeggiePizza();
}
return pizza;
}
看到了吧,这就是一个Simple Factory,它创建了我们需要的Pizza对象。接下来看一下我们的orderPizza方法发生了什么改变。
public class PizzaStore{
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory fatory){
this.factory = factory;
}
public Pizza orderPizza(String type){
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
现在我们修改代码的时候只要修改factory了就可以了,但是Simple Factory的问题在于不能继承,接下来的两个工厂模式很好的解决了该问题。正在学习中,不对的地方请大家指出:)