在开始笔记之前先推荐一个网站:http://design-patterns.readthedocs.org/zh_CN/latest/index.html
网站对每一个Pattern都有详尽的解说。并且都有UML图帮助理解记忆。
工厂模式(Factory)
属于创建型模式,解决创建对象代码重复的问题。同时使抽象对象不依赖于具体对象。
按照不同的层次有3种实现方法:简单工厂,工厂方法,抽象工厂
简单工厂 Simple Factory
严格来说简单工厂算不上是一种设计模式。其更像一种编程习惯。即将重复的代码进行封装重用。
Head First例子
在PizzaStore类中有OrderPizza方法。方法中根据不同的要求创建Pizza,然后切块,包装。引入简单工厂,将原来在OrderPizza中的具体创建Pizza的new代码(一长串的if else if),移到PizzaFactory中。达到重用,依赖倒置的效果。
依赖倒置;依赖抽象不依赖具体
dependency inversion; depend on abstractions not concrete classes
Origianl Bad Design: PizzaStore ---> various Pizza
New Good Design: PizzaStore ---> Pizza <--- variouse Pizza
工厂方法 Factory Method
创建者包含一个工厂方法。在具体的使用者中实现工厂方法create()创建具体的产品。在这里有两个平行的类族。使用者类族和产品类族。特征是抽象创建者中包含一个抽象的工厂方法。但具体实现留给子类。
Head First例子
不同的地区有PizzaStore加盟店。OrderPizza的逻辑不变。不同的地域风味PizzaStore继承PizzaStore。在各自的creatPizza方法中创建地域风味Pizza。
抽象工厂 Abstract Factory
产品包含一系列原料。创建一个工厂的类族,包含创建一系列具体原料的方法。具体产品的prepare()方法中,使用抽象工厂初始化自己的原料。如工厂方法中,使用者也是一个类族。具体使用者的工厂方法create()中创建具体的工厂,然后将具体工厂传给具体产品进行构造。
Head First例子
不同的Pizza(芝士,蔬菜)包含不同的原料。相同类型的Pizza,在不同的地域,要使用该地域的原料。在准备原料时,具体Pizza需要一个抽象原料工厂,去创建原料。
每一种原料都是一个类族。抽象原料和具体不同地域风味原料。
工厂类族,具体的工厂创建不同的地域风味原料。
在加盟的地域PizzaStore中,实现create()方法。创建原料工厂。参数指示创建何种具体Pizza。将工厂传给具体Pizza,创建具体Pizza。返回抽象的Pizza。
下图的Client是ConcretePizza