[翻译]工厂模式

意图

  • 定义一个接口用于创建对象实例,但由继承自接口的子类决定具体实例化哪种对象类型。工厂模式使对象类型实例化的动作推迟到接口的子类中;
  • 定义一个“虚拟”构造器;
  • new操作符被认为对程序有危害。

问题

    构建应用程序框架时,需要规范框架的结构模型,便于其他应用系统使用此框架。同时,框架允许个别应用程序定义它自己的对象子类(译注:基类定义在程序框架中),并提供这些子类的实例化操作。

讨论

    采用工厂模式创建对象实例类似于使用模板模式实现算法。首先定义一个父类指定所有通用的行为(在程序实现时使用虚拟占位符表示通用行为),然后客户端程序创建继承此父类的子类以实现这些通用行为。

    工厂模式使软件设计更加可定制,并且软件设计复杂度没有增加多少。其它设计模式都需要创建新的类型,而工厂模式仅要去增加新的操作。

    设计人员常采用工厂模式作为创建对象实例的首选方法。但是在下列情况下可以不使用工厂模式:1)类的实例化过程从不发生变化;2)类的实例化过程包含在一个操作中,而类的子类可以轻易的重写这个操作(比如实例化过程包含在一个初始化操作中)。

    工厂模式与抽象工厂模式类似,但抽象工厂模式更侧重于创建一系列对象实例。

    工厂模式通常由应用程序框架定义(译注:应该是定义工厂方法接口),然后由使用该框架的用户实现工厂模式。

结构

    在四人帮(GoF)的书中(设计模式——可复用面向对象软件的基础),工厂模式的实现方式与抽象工厂模式很大程度上重复。因此,本节展示目前比较流行的工厂模式实现方式。

    日渐流行的工厂模式定义方式为:在类中定义一个静态方法,该方法返回一个对象的实例。此静态方法与类的构造函数有以下不同:1)静态方法可能返回子类的对象实例,构造函数只能返回当前类型的对象实例;2)多次调用此静态方法,返回的对象实例可能是同一个值,而不是每次调用都返回一个新的对象实例,但是构造函数每次都返回一个新的对象实例;3)构造函数的函数名称不能改变,而工厂模式重点的方法名称可以随意改动(例如,类Color中包含两类工厂模式函数,Color.make_RGV_color(float red,float green,float blue)和 Color.makeHSB_color (float hue ,  float saturation , float brightness))。

    至此,采用工厂方法,客户端与子类的实现完全解耦(这里指客户端只是调用接口,而不用考虑如何实现接口)。对象实例以多态方式创建的可能性比较大了。

     工厂模式定义一个接口用于创建对象实例,但由继承自接口的子类决定具体实例化哪种对象。注塑成型机可以诠释工厂模式,塑料玩具工厂制作塑料粉末,并将塑料粉末压入需要制造的玩具模型中。玩具类型(汽车、人偶等)由使用的玩具模型决定。

核对列表

  1、如果你定义了基类和子类以实现多态,可以考虑在基类中定义一个静态工厂方法以创建不同的子类对象实例;

  2、精心设计工厂模式方法的输入参数。究竟这些参数需要具备什么样的特性才能使工厂方法返回真正子类对象实例?

  3、可以考虑在工厂模式内部定义一个内部对象池,这样就能支持对象实例的复用,而不是每次调用工厂方法都创建一个新的对象实例;

  4、可以考虑将所有类的构造函数都定义为private或者protected,转而采用工厂模式创建对象实例。

经验

  • 抽象工厂模式经常采用工厂模式作为代码实现,而他们两个又都可以采用原型模式作为代码实现;
  • 模板模式的代码实现通常会包含工厂模式。
  • 工厂模式:通过继承方式创建对象。原型模式:通过代理方式创建对象。
  • 软件设计之初,常采用工厂模式(该模式实现简单,定制性强,可通过创建新子类以生成新对象)。随着设计的深入,设计人员认为程序应该设计的更加灵活时,就会采用抽象工厂模式、原型模式或者生成器模式(这些模式更灵活,代码实现也更复杂)。
  • 原型模式不要求代码中存在子类,但是要求有初始化操作。相反,工厂模式需要代码中有子类,但是不需要初始化操作;
  • 工厂模型的优点是多次调用工厂方法可以返回同一个对象实例,也可以每次返回不同的子类对象实例,而不需要每次都返回同样类型的对象实例;
  • 一些工厂模式的拥护者提倡,作为一种程序语言设计方法(或者说,作为一种编程风格),在程序中所有类型的构造函数都定义为private或者protected,除了调用工厂模式方法获取对象实例,没有其它方式创建新的对象实例或者重用之前的对象实例;
  • new操作符被认为对编程有危害。获取一个对象实例和创建一个对象实例之间是有差别的。new操作符只能创建一个新的对象实例,不能封装对象创建过程,而工厂模式强调封装对象创建过程,并且允许程序没有对象实例创建动作就可以直接获取获取一个对象实例。

 

原文地址:http://sourcemaking.com/design_patterns/factory_method

下面的链接是我写的一个示例程序:

http://pan.baidu.com/s/1o6oLld4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值