设计模式(二) 工厂方法(FactoryMethod)
2014-12-20 16:25
531 查看
1.定义
工厂方法是一种对象创建型的设计模式。上一节中谈到的抽象工厂经常使用工厂方法实现。与其他创建型模式一样,工厂方法解决的是在不指定对象具体类型的情况下创建对象的问题。它仅定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类实例化延迟到其子类。
2.结构
Product : 定义工厂方法创建对象的接口
ConcreteProduct : 实现Product 接口
Creator : 声明工厂方法,该方法返回一个Product类型对象
ConcreteCreator : 重新定义工厂方法以返回一个ConcreteProduct实例
3.适用性
当一个类不知道它所必须创建的类的时候
当一个类希望它的子类来指定他所创建的对象的时候
创建对象需要大量重复的代码
工厂方法常见于工具包和框架当中,这些库中可能需要创建客户端代码实现的具体类型的对象。
4.举例说明
其实工厂方法相当于简化了的抽象工厂,理解起来应该没什么难度。
我们定义DigitalDevice,DigitalDeviceFactory, Phone, PhoneFactory几个类/接口以及测试类Test:
DigitalDevice.java:
PhoneFactory.java
Test.java
通过ConcreteFactory(PhoneFactory)生产ConcreteProduct(Phone),我们实现了创建和使用的分离,隐藏了生产产品的细节。现在如果我们想要拓展DigitalDevice,加入Pad类和生产PadFactory类,那么我们无需修改之前的代码。在测试Pad的时候只需要将构造对象改为 new PadFactory即可。
工厂方法的潜在缺点有:
可能仅仅为了创建一个特定的ConcreteProduct对象,而不得不创建一个Creator子类
重构已存在的类可能会破坏客户端代码
另外,可能还有很多人觉得工厂方法和抽象方法何其相似,这里引用
cjjky 的一张图片,说明一下两者的区别:
这里我们先看看两个概念:产品族和产品等级。
产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:
参考文献
1.维基百科:工厂方法
2.设计模式:可复用面向对象软件的基础
3.工厂方法模式(Factory Method)(一)
工厂方法是一种对象创建型的设计模式。上一节中谈到的抽象工厂经常使用工厂方法实现。与其他创建型模式一样,工厂方法解决的是在不指定对象具体类型的情况下创建对象的问题。它仅定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类实例化延迟到其子类。
2.结构
Product : 定义工厂方法创建对象的接口
ConcreteProduct : 实现Product 接口
Creator : 声明工厂方法,该方法返回一个Product类型对象
ConcreteCreator : 重新定义工厂方法以返回一个ConcreteProduct实例
3.适用性
当一个类不知道它所必须创建的类的时候
当一个类希望它的子类来指定他所创建的对象的时候
创建对象需要大量重复的代码
工厂方法常见于工具包和框架当中,这些库中可能需要创建客户端代码实现的具体类型的对象。
4.举例说明
其实工厂方法相当于简化了的抽象工厂,理解起来应该没什么难度。
我们定义DigitalDevice,DigitalDeviceFactory, Phone, PhoneFactory几个类/接口以及测试类Test:
DigitalDevice.java:
public class DigitalDevice { protected String name; protected double price; }DigitalDeviceFactory.java
interface DigitalDeviceFactory { DigitalDevice createDevice(); }Phone.java
public class Phone extends DigitalDevice { public Phone(){ name = "Phone"; System.out.println("Im am phone."); } }
PhoneFactory.java
public class PhoneFactory implements DigitalDeviceFactory { @Override public DigitalDevice createDevice() { // TODO Auto-generated method stub return new Phone(); } }
Test.java
public class Test { public static void main(String[] args) { DigitalDeviceFactory factory = new PhoneFactory(); factory.createDevice(); } }控制台输出:
Im am phone.
通过ConcreteFactory(PhoneFactory)生产ConcreteProduct(Phone),我们实现了创建和使用的分离,隐藏了生产产品的细节。现在如果我们想要拓展DigitalDevice,加入Pad类和生产PadFactory类,那么我们无需修改之前的代码。在测试Pad的时候只需要将构造对象改为 new PadFactory即可。
工厂方法的潜在缺点有:
可能仅仅为了创建一个特定的ConcreteProduct对象,而不得不创建一个Creator子类
重构已存在的类可能会破坏客户端代码
另外,可能还有很多人觉得工厂方法和抽象方法何其相似,这里引用
cjjky 的一张图片,说明一下两者的区别:
这里我们先看看两个概念:产品族和产品等级。
产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:
参考文献
1.维基百科:工厂方法
2.设计模式:可复用面向对象软件的基础
3.工厂方法模式(Factory Method)(一)
相关文章推荐
- Java设计模式圣经连载(02)-工厂方法(Factory Method)模式
- 设计模式(八)[工厂方法(Factory Method)模式]
- 设计模式--工厂方法(FactoryMethod)
- 【初学设计模式】Factory Method (工厂方法)
- 设计模式 工厂方法(Factory Method Pattern)
- 设计模式之工厂方法(Factory Method)模式
- 设计模式 工厂方法(Factory Method Pattern)转载
- 设计模式之FactoryMethod(工厂方法)
- 设计模式笔记-创建型模式之三--工厂方法:Factory Method
- 设计模式--工厂方法(FactoryMethod)
- C#面向对象设计模式纵横谈(四) --- Factory Method 工厂方法(创建型模式)
- 3.23种设计模式的Java版--Factory Method(工厂方法)
- 设计模式-工厂方法(Factory Method)
- 设计模式之Factory Method(工厂方法)
- 设计模式示例一 Factory Method(工厂方法)
- 设计模式-工厂方法(Factory Method)
- 设计模式-创建型模式之 Factory Method(工厂方法)
- 设计模式四:Factory method工厂方法——对象创建型模式
- 设计模式(1)-工厂方法(Factory Method)
- VB.net设计模式之工厂方法,抽象工厂方法(Factory Method Pattern,Abstract Factory Method Pattern)