(创建型模式)Factory——简单工厂模式

一、意图

     定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory使一个类的实例化延迟到其子类。(四人团)

    实际上: 工厂模式主要就是用于创建对象。新添加类时,不会影响以前的系统代码。

二、基本思想

   核心思想:是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。

     客户类和工厂类分开,消费者任何时候需要某种产品类对象,只需要向工厂类(有静态成员函数接收)提交参数和请求即可。消费者无需修改(直接用所有产品共同的父类指针指向)就可以接纳和使用新产品类的对象。

三、优缺点分析

GOOD: 适用于不同情况创建不同的类时

BAD:  客户端必须要知道基类和工厂类,耦合性差,而且当产品修改时,工厂类也要做相应修改(如:如何创建及如何向客户端提供)

四、UML实例图

clip_image002

注意点:(工厂类与基类为关联关系)

五、示例源码

   1: (工厂类与基类为关联关系)
   2: 例:
   3: //基类
   4: class COperation
   5: {
   6: public:
   7:     int m_nFirst;
   8:     int m_nSecond;
   9:     virtual double GetResult()
  10:     {
  11:         double dResult=0;
  12:         return dResult;
  13:     }
  14: };
  15: //加法
  16: class AddOperation : public COperation
  17: {
  18: public:
  19:     virtual double GetResult()
  20:     {
  21:         return m_nFirst+m_nSecond;
  22:     }
  23: };
  24: //减法
  25: class SubOperation : public COperation
  26: {
  27: public:
  28:     virtual double GetResult()
  29:     {
  30:         return m_nFirst-m_nSecond;
  31:     }
  32: };
  33:  
  34: //工厂类
  35: class CCalculatorFactory
  36: {
  37: public:
  38:     static COperation* Create(char cOperator);
  39: };
  40:  
  41: COperation* CCalculatorFactory::Create(char cOperator)
  42: {
  43:     COperation *oper;
  44:     //在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??
  45:     switch (cOperator)
  46:     {
  47:     case '+':
  48:         oper=new AddOperation();
  49:         break;
  50:     case '-':
  51:         oper=new SubOperation();
  52:         break;
  53:     default:
  54:         oper=new AddOperation();
  55:         break;
  56:     }
  57:     return oper;
  58: }
  59:  
  60: 客户端
  61: int main()
  62: {
  63:     int a,b;
  64:     cin>>a>>b;
  65:     COperation * op=CCalculatorFactory::Create('-');
  66:     op->m_nFirst=a;
  67:     op->m_nSecond=b;
  68:     cout<<op->GetResult()<<endl;
  69:     return 0;
  70: }
posted @ 2010-05-23 19:35  红脸书生  阅读(1031)  评论(0编辑  收藏  举报