<漫谈设计模式>======对象创建型模式之工厂方法模式

Factory Method 工厂方法模式
1.意图

   定义一个用于创建对象的接口,让子类去决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类.


2.动机

    假设有这样一个应用框架(client端),它可以向用户显示多个文档.在这个框架中,有两个抽象的类.Application和
Document.这两个类都是抽象的,客户必须通过它们的子类来做与具体应用相关的实现.例如,我们有一个画图程序.
我们定义类DrawingApplication和DrawingDocument.Application类负责管理Document并根据需要创建它们---比如,
当用户选择open或者new的时候(这种情形我们也经常遇到,比如MFC中的Application和Document的关系).
   因为被实例化的特定Document子类是与特定应用相关的.所以
Application类不可能预测到哪个Document子类
即将被实例化
. Application类仅知道一个新的文档什么时候被创建.但是它不知道哪一种Document将被创建 .
这样就产生了一个尴尬的局面: 框架必须实例化类,但是它只知道不能实例化的抽象类 .
  Factory Method模式提供了一个解决方案,它封装了哪一个Document子类将被创建的信息并将这些信息从该框架中分离出来

放入单独的类中(MyApplication类),UML图如下.Application中定义了虚函数CreateDocument用来创建文档,这就好比定义了具有生产功能的工厂.但是这个工厂到底能生产什么.

我们需要在它的子类(MyApplication)中来决定( 也就是将类的实例化放入的它的子类 ).因为它 重写了CreateDocument这个虚函数 .


4.结构图


5.适用性
<1>当一个类不知道它所必须创建的对象的类的时候.( 想想Application=。= )
<2>当一个类希望由它的子类来指定它所创建的对象的时候.
<3>当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将某一个帮助子类是代理者这一信息局部化的时候.

6.实现(大话设计模式中的计算器例子)

以加法为例:
  1. class Factory  
  2. {
  3. public:
  4.         virtual Operation * CreateOperation() = 0;
  5.         Factory();
  6.         virtual ~Factory();
  7. };
复制代码
定义一个抽象的Factory类(VC自动生成的代码,没用的东西我就懒得去掉了),用来生产对象.
接下来定义我们需要生产的产品,这个例子中就是Operation(运算法则).
  1. class Operation  
  2. {
  3. public:
  4.         virtual int GetResult();
  5.         Operation();
  6.         virtual ~Operation();
  7.         int _result;
  8.         int _numberB;
  9.         int _numberA;
  10. };
复制代码
其中包含了获取结果的接口和两个操作数,还有返回值.这个就是我们需要生产的产品的抽象类.
具体到某个产品就可以使加法,减法等操作.
我们定义一个加法操作类AddOperation
  1. class AddOperation : public Operation  
  2. {
  3. public:
  4.         int GetResult();
  5.         AddOperation();
  6.         virtual ~AddOperation();

  7. };
复制代码
并重写GetResult方法
  1. int AddOperation::GetResult()
  2. {
  3.         _result=_numberA+_numberB;
  4.         return _result;
  5. }
复制代码
需要生产的对象有了,接下来就是具体生产这种对象的工厂了.这个例子中就是AddFactory
  1. class AddFactory : public Factory  
  2. {
  3. public:
  4.         Operation * CreateOperation();
  5.         AddFactory();
  6.         virtual ~AddFactory();

  7. };
复制代码
重写CreateOperation方法
  1. Operation * AddFactory::CreateOperation()
  2. {
  3.         return new AddOperation();
  4. }
复制代码
到这里,工厂模式已经完成.

接下来看看客户端怎么使用它吧.
  1. int main()
  2. {
  3.         Operation * factory;
  4.         int result;
  5.         factory = new AddOperation();
  6.         result=factory->GetResult();
  7.         cout<<result<<endl;
  8. }
复制代码
是不是方便了很多=。=
以后要添加除法,乘法,甚至是多个操作数的运算.
我们只需要拓展类就行了,不用修改代码.正好满足开发-封闭原则(软件实体应该可以拓展,但是不可修改).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值