1. 模式意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式是简单工厂模式的进一步抽象和推广。
由于使用了多态,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
在工厂方法模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。
1.1 工厂方法模式 v.s. 简单工厂模式
- 工厂方法类的核心是一个抽象工厂类,而简单工厂模式吧核心放在一个具体类上。
- 工厂方法模式也叫多态工厂模式,因为具体工厂都有将共同的接口,或者有共同的抽象类。
- 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改;而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。
- 工厂方法模式退化后可以演变成简单工厂模式。
1.2 抽象工厂模式 v.s. 工厂方法模式
大部分抽象工厂模式是这样的:
它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象/产品。
比如:工厂生产鼠标和键盘(产品);那么抽象工厂的实现类都可以生成鼠标和键盘,例如A工厂生成罗技的鼠标和键盘,B工厂生产微软的鼠标和键盘;这样A和B就对应于工厂;每个工厂生成的鼠标和键盘是产品,对应于工厂方法;
使用工厂方法模式,替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是使用了抽象工厂模式,只要换家工厂,就可以同时替换鼠标和键盘;如果生成的产品有几十个,使用抽象工厂模式一次替换全部的产品最方便。
抽象工厂就像是工厂;工厂方法则像是工厂的一种产品生产线;
- 抽象工厂模式依赖于工厂方法模式;
- 工厂方法针对的是一个产品等级结构;抽象工厂模式是面向多个产品等级结构的;
- 工厂方法模式只有一个抽象产品类;而抽象工厂类则有对各抽象产品类;
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例;而抽象工厂模式的具体工厂类则可以创建多个具体产品类的实例;
2. 模式定义
抽象工厂角色(Creator):工厂方法模式的核心,与应用程序无关。任何在模式中创建对象的工厂类必须实现这个接口;
具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑;
抽象产品(Product):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口,如Light;
具体产品(Concrete Product):这个角色实现了抽象产品所定义的接口;某个具体产品有专门的具体工厂创建,它们之间往往一一对应;
3. 模式定义
4. 模式应用