本文内容来自书《Head First Design Pattern》和老师英文PPT(基本上也是来自这本书),有错误欢迎指出!
The Factory Pattern
前言
我想new一个对象,比如说Pizza的对象,但是根据输入的不同,可能new其不同的子类,比如CheesePizza, VegePizza...,一旦我需要删除增加披萨类型,代码就需要一改再改。(要面对abstract,而不是面对implementation)因此,我们需要封装创建对象(object creation)的代码。
简单工厂
使用一个工厂类,把创造对象的过程封装起来,来生产同一等级结构中的任意产品。
Pizza、PizzaStore:均abstract
工厂方法模式Factory Method Pattern
概念
工厂方法模式定义了创建对象的接口,但让子类决定实例化(instantiate)哪个类。工厂方法允许类延迟实例化(defer instantiation)到子类。
例子中,创建对象的接口:createPizza(抽象的工厂方法);因为PizzaStore(Creator)类抽象,所以必须把实现创建对象的步骤延迟到子类(如NYPizzaStore中),但父类仅仅是对Pizza(Product)进行操作,实现解耦。
Delegating to subclass:每个子类都具体实现这个抽象工厂方法。
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = **createPizza(type)****;**
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
abstract Pizza createPizza(String type);
}
此时,一个工厂的client或许可以对应多个工厂;而每个工厂可以把创建对象的代码在其中封装成一个方法,方便使用。
- [ ] 工厂方法在工厂1,工厂2中。
抽象方法
abstract Product factoryMethod(String type)
abstract:工厂方法是抽象的,因此依赖于子类来处理对象创建
Product:工厂方法返回一个Product,通常在Creator中定义的方法中使用
工厂方法:工厂方法使creator(父类中的代码)不知道具体创建了什么样的Product,只是对抽象的Product的对象进行处理
String type:工厂方法可以参数化(也可以不),以在Product的几个子类中进行选择
“Open for Extension, Closed for Modification”
Dependency Inversion依赖倒置
The Abstract Factory
抽象工厂模式提供了一个接口,用于创建一系列相关或依赖的对象,而无需指定它们的具体类。
我感觉抽象工厂需要自己写一写代码才能理解,有机会再把代码发上来。