《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的具体类依赖的是工厂和调料的接囗类。
以上同样满足了“依赖抽象,不要依赖具体类”的设计原则。
新的设计原则:
依赖抽象,不要依赖具体类。
要点:
所有的工厂都是用来封装对象的创建。
所有工厂模式都通过减少应用程序与具体类之间的依赖促进松耦合。
工厂方法允许类将实例化推迟到子类进行。
抽象工厂创建相关的对象家族,而不需要依赖它们的具体实现。
工厂方法模式与抽象工厂模式的不同:
工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂使用对象组合:对象的创建被实现在工厂接囗所暴露出的方法中。
抽象工厂用来创建整个产品家族,而工厂方法通常只创建一个产品。
本文出自 “赞否两论-量子” 博客,请务必保留此出处http://quantum.blog.51cto.com/3633234/1117378
一,简单工厂(并不是一个设计模式,更像是一种编程习惯)
例如:
将创建各个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
相关文章推荐
- 【head first 设计模式学习笔记】工厂模式
- Head First 设计模式学习笔记(4)---工厂模式
- HeadFirst 设计模式学习笔记4--工厂模式
- Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件
- Head First 设计模式学习笔记(3)---装饰器模式
- java 设计模式学习笔记二 工厂模式Factory
- 设计模式学习笔记——简单工厂(Simple Factory)
- 设计模式学习笔记-----工厂模式
- 设计模式学习笔记(五):工厂方法模式
- Head First 设计模式学习笔记 —— 单件模式
- Head First_设计模式_学习笔记_第01章_策略模式
- 【设计模式学习笔记】——工厂系列
- java 设计模式 学习笔记(1) - 简单工厂模式
- 设计模式学习笔记二 ——工厂模式
- 【设计模式】学习笔记5:工厂模式
- java 设计模式学习笔记二 工厂模式Factory
- 设计模式学习笔记——工厂方法(Factory Method)
- 设计模式学习笔记(三)--工厂模式
- [学习笔记]Head First 设计模式 - 策略模式(Strategy)
- 学习笔记:设计模式之工厂模式