工厂方法模式(Factory Method Pattern,对象创建型模式)

来源:互联网 发布:零基础学油画知乎 编辑:程序博客网 时间:2024/06/16 11:07

意图

  工厂方法模式去掉了简单工厂模式中的静态方法,使其能够被继承,并且有具体的工厂来完成产品的创建工作。
 定义一个用于创建对象的接口,让子类决定类实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

适用性

在下列情况下可以使用Factory Method模式:
1. 当一个类不知道它所必须创建的对象的类的时候
2. 当一个类希望由它的子类来指定它所创建的对象的时候
3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
4. 知道 产生产品的具体工厂;不知道具体的工厂,由生产者自己确定

结构

这里写图片描述

参与者

Product

  1. 定义工厂方法所创建的对象的接口
  2. 具体产品需要实现的类

ConcreteProduct

  1. 实现Product
  2. 具体工厂所创建的对象就是该角色的实例
  3. 建立对象实例交给之类

Creator(AbstractFactory)

  1. 声明一个工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
  2. 可以调用工厂方法以创建一个Product对象
  3. 核心,与应用无关,是具体工厂必须实现的对象

ConcreteCreator(ConcreteFactory)

  1. 重定义工厂方法以返回一个ConcreteProduct实例。
  2. 含有具体业务逻辑相关的代码,创建具体的产品

代码

Product

public abstract class FuritProduct {    public abstract void method();}

ConcreteProduct

public class AppleConcreteProduct extends FuritProduct{    public void method() {        System.out.println("我是苹果");    }}public class BananaConcreteProduct extends FuritProduct{    public void method() {        System.out.println("我是香蕉");    }}

AbstractFactory

public abstract class AbstractFactory {    public abstract FuritProduct getFuritProduct();}

ConcreteFactory

public class AppleConcreteFactory extends AbstractFactory{    public FuritProduct getFuritProduct() {        return new AppleConcreteProduct();    }}public class BananaConcreteFactory extends AbstractFactory{    public FuritProduct getFuritProduct() {        return new BananaConcreteProduct();    }}

Client

public class Client {    public static void main(String[] args) {        AbstractFactory appleConcreteFactory = new AppleConcreteFactory();        appleConcreteFactory.getFuritProduct().method();        AbstractFactory bananaConcreteFactory = new BananaConcreteFactory();        bananaConcreteFactory.getFuritProduct().method();    }}

协作

 Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。

效果

 工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接口;因此它可以与用户定义的任何ConcreteProduct类一起使用。
 工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论如何必须创建Creator的子类时,创建子类也是可行的。

为子类提供挂钩(hook)

 用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。Factory Method给子类一个挂钩以提供对象的扩展版本。

连接平行的类层次

 迄今为止,在我们所考虑的例子中,工厂方法并不往往只是被Creator调用,客户可以找到一些有用的工厂方法,尤其在平行类层次的情况下。
当一个类将它的一些职责委托给一个独立的类的时候,就产生了平行类层次。

优点

良好的封装性,代码结构清晰,隐藏对象的具体创建过程
2. 工厂方法模式的扩展性非常优秀
3. 屏蔽产品类
4. 工厂方法模式是典型的解耦框架。高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特原则,我不需要的就不要去交流;也符合依赖倒转原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!

实现

主要有两种不同的情况

  1. Creator类是一个抽象类并且不提供它所声明的工厂方法的实现
  2. Creator是一个具体的类而且为工厂方法提供一个缺省的实现,也可能是定义缺省实现的抽象类。
     第一种情况需要子类来定义实现,因为没有合理的缺省实现。它避免了不得不实例化不可预见类的问题。在第二种情况中,具体的Creator主要因为灵活性才使用工厂方法。它所遵循的准则是,“用一个独立的操作创建对象,这样子类才能重定义它们的创建方式。”这条准则保证了子类的设计者能够在必要的时候改变父类锁实例化的对象的类。

参数化工厂 方法

 该模式的另一种情况使得工厂方法可以创建多种产品。工厂方法采用一个标识要被创建的对象种类的参数。工厂方法创建的所有对象将共享Product接口。
 一旦类标识被读取后,这个框架就将该标识符作为参数,调用Create。Create到构造器中查询相应的类并用它实例化对象。最后,Create调用对象的Read操作,读取磁盘上剩余的信息并初始化该对象的实例变量。
 重定义一个参数化的工厂方法使你可以简单而有选择性的扩展或改变一个 Creator生产的产品。你可以为新产品引入新的标识符,或可以将已有的标识符与不同的产品相关联。

使用模板以避免创建子类

 正如我们已经提及的,工厂方法另一个潜在的问题是它们可能仅为了创建适当的Product对象而迫使你创建Creator子类。在C++中另一个解决方法是提供Creator的一个模板子类,它使用Product类作为模板参数。

相关模式

Singleton Pattern

抽象工厂和具体工厂可以采用该模式实现。

Composite Pattern

在某些情况可以提供Composite Pattern给Product 参与者或则ConcreteProduct参与者

Iterator Pattern

在迭代模式中利用Iterator方法产生Iterator的对象实例时,可能会用到工厂方法模式。

Abstract Factory Pattern

抽象工厂模式经常用工厂方法实现。

Template Method Pattern

工厂方法通常在Template Method中被调用。工厂方法模式是典型的模板方法模式,程序中的create方法就是模板方法

Prototype Pattern

Prototypes不需要创建Creator的子类。但是,它们通常要求一个针对Product类的Initialize操作。Creator使用Initialize来初始化对象。而Factory Method不需要这样操作。

敬请期待“抽象工厂模式(Abstract Factory Pattern,对象创建型模式)”

0 0
原创粉丝点击