您的位置:首页 > 其它

《Head First 设计模式》学习笔记:工厂模式

2013-01-13 15:13 330 查看
工厂模式:

一,简单工厂(并不是一个设计模式,更像是一种编程习惯)
例如:
将创建各个Pizza子类对象的new方法封将到一个新的类里:
Public Class SimplePizzaFactory{
public Pizza createPizza(String type){
//根据type创建不同的对象
}
}
然后在PizzaStore(Pizza店)类使用pizza = factory.createPizza(type);//factory is SimplepizzaFactory

二,工厂方法模式
定义了一个创建对象的接囗,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

以披萨店生产披萨的模拟应用为例:
首先我们需要PizzaStore(披萨专卖店)抽象类与Pizza(披萨产品)抽象类。
PizzaStore抽象类有一个orderPizza(订购Pizza)的非抽象方法,此方法需要创建披萨对象,而Pizza本身为抽象类,正常来讲此时需要创建具体披萨类的实例;
为了让PizzaStore不依赖于具体类,在PizzaStore类定义的Pizza创建方法createPizza为抽象方法;
因为createPizza为PizzaStore类的抽象方法,真正实例化由PizzaStore的子类完成。这样利用多态就实现了把实例化推迟到子类。
PizzaStore nyStore = new NYPizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
这也是一个依赖倒置原则的例子。因为PizzaStore类与继承自Pizza的具体类都依赖于一个Pizza抽象类。(依赖抽象,不要依赖具体类)

简单工厂和工厂方法的区别在于:简单工厂把所有的事情在一个地方(SimplePizzaFactory)处理完了,而工厂方法却创建一个框架,让子类决定如何实现。

三,抽象工厂模式
提供一个接囗,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

以披萨连锁店的调料管理的模拟应用为例:

创建一个PizzaIngredientFactory接囗类;
创建所有调料类型的接囗类及具体实现类;
在PizzaIngredientFactory定义一组抽象方法对应创建所有的调料,由具体子类实现调料的获取;
不同地区的连锁店可以使用PizzaIngredientFactory的不同具体子类,来获得不同地区的调料搭配(同一种调料不同地区对应不同的具体实现类);
比如纽约的连锁店NYPizzaStore,在构造时引入纽约调料工厂NYPizzaIngredientFactory,从PizzaIngredientFactory得到本地区风格的调料,就可以生产出纽约风格的Pizza。

与工厂方法相似,PizzaIngredientFactory依赖的是调料的接囗类,而非调料的具体实现类;同样,Pizza类依赖的是调料的接囗类;Pizza的具体类依赖的是工厂和调料的接囗类。

以上同样满足了“依赖抽象,不要依赖具体类”的设计原则。

public class NYPizzaStore extends PizzaStore {

protected Pizza createPizza(String item) {
Pizza pizza = null;
PizzaIngredientFactory ingredientFactory =
new NYPizzaIngredientFactory();

if (item.equals("cheese")) {

pizza = new CheesePizza(ingredientFactory);
pizza.setName("New York Style Cheese Pizza");

} else if (item.equals("veggie")) {

pizza = new VeggiePizza(ingredientFactory);
pizza.setName("New York Style Veggie Pizza");

} else if (item.equals("clam")) {

pizza = new ClamPizza(ingredientFactory);
pizza.setName("New York Style Clam Pizza");

} else if (item.equals("pepperoni")) {

pizza = new PepperoniPizza(ingredientFactory);
pizza.setName("New York Style Pepperoni Pizza");

}
return pizza;
}
}


新的设计原则:
依赖抽象,不要依赖具体类。

要点:
所有的工厂都是用来封装对象的创建。
所有工厂模式都通过减少应用程序与具体类之间的依赖促进松耦合。
工厂方法允许类将实例化推迟到子类进行。
抽象工厂创建相关的对象家族,而不需要依赖它们的具体实现。

工厂方法模式与抽象工厂模式的不同:
工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂使用对象组合:对象的创建被实现在工厂接囗所暴露出的方法中。
抽象工厂用来创建整个产品家族,而工厂方法通常只创建一个产品。

本文出自 “赞否两论-量子” 博客,请务必保留此出处http://quantum.blog.51cto.com/3633234/1117378
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: