zoukankan      html  css  js  c++  java
  • 设计模式学习系列4 简单工厂模式

             从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

    1简单工厂模式结构图

    clipboard[3]

    简单工厂模式主要包含三部分

    (1)工厂:负责根据客户需求创造需要的产品

    (2)抽象产品:工厂生产产品的父类

    (3)具体产品

    2代码分析

     
     /*设计模式学习系列之简单工厂模式 
    * 参考书籍《大话设计模式》 
    * 简单工厂模式 的主要用途:根据需求创造需要的实例 
    * 
    * 例子逻辑:两个数的各种运算 
    */ 
    
     #include <iostream>
     using namespace std;
     
     enum OperatorType
     {
         ADD = 1,
         SUB,
         MUL,
         DIV,
     };
     //运算类基类 
     class Operation
     {
    public:
        double numA ;
        double numB ;    
    public:
         Operation():numA(0),numB(0){}
         Operation(const double& a , const double& b)
         {
            numA = a ;
            numB = b ;      
        }
        virtual ~Operation(){}    
        
        void SetNumA(const double& a)
        {
            numA = a ;
        }
        
        void SetNumB(const double& b)
        {
            numB = b ;
        }
        
        virtual double GetResult()
        {
            return 0.0f ;    
        }        
     };
     
     
     //加法类
     class OperationAdd: public Operation
     {
         double GetResult()
         {
            return numA + numB ;      
        }
     };
      
      //减法类
     class OperationSub: public Operation
     {
         double GetResult()
         {
            return numA - numB ;      
        }
     };
     
     
     //乘法 
     class OperationMul: public Operation
     {
         double GetResult()
         {
            return numA * numB ;      
        }
     };
     
     
      //除法 
     class OperationDiv: public Operation
     {
         double GetResult()
         {
             if(numB == 0)
            {
                 cout << "除数不能为0 
    " << endl ;
                 return 0 ;     
             } 
             
            return numA / numB ;      
        }
     };
     
     
     //工厂类
     class Factory
     {
         public:
         static Operation* CreateOperation(const int& type)
        { 
            Operation * pOperation = 0 ;
            //c++ Switch判断语句中只允许整形和枚举类型,即integer type:char,short,int,long,
            //不建议使用float类型以及string类型 
             switch(type)     
             {
                 case ADD:
                 {
                     pOperation = new OperationAdd ;    
                 }
                 break ;
                 case SUB:
                 {
                     pOperation = new OperationSub ;    
                 }
                 break ;
                 case MUL:
                 {
                     pOperation = new OperationMul ;    
                 }
                 break ;     
                 case DIV:
                 {
                     pOperation = new OperationDiv ;    
                 }
                 break ;    
                default:
                break;
    
            }
            
            return pOperation ;
         }    
     };
      //===============================
      
      #include "factory_sm.h"
      
      
      int main()
      {
            Operation *pOpe = NULL ;
            
            pOpe = Factory::CreateOperation(ADD);
            pOpe->SetNumA(10);
            pOpe->SetNumB(10);
            
            cout << pOpe->GetResult() << endl ;
        delete pOpe ; //工厂中创建了,但没释放,这是个问题 }

    注意的问题:

    (1)//c++ Switch判断语句中只允许整形和枚举类型,即integer type:char,short,int,long, //不建议使用float类型以及string类型

    (2)上面方法中 创建类的释放是个问题,因为工厂类没有做到自动释放,需要在代码中主动释放,不是很好,不知道由什么好的方法

    细雨淅淅 标签:
  • 相关阅读:
    转:测试驱动开发全攻略
    转:如何提高自己的归纳总结能力?
    转:从编译链接过程解析static函数的用法
    C++ 不能在类体外指定关键字static
    转:画图解释 SQL join 语句
    转:[置顶] 从头到尾彻底理解KMP(2014年8月22日版)
    转:The Knuth-Morris-Pratt Algorithm in my own words
    转:数组与指针的区别
    删除单链表中间节点
    如果判断两个单链表有交?第一个交点在哪里?
  • 原文地址:https://www.cnblogs.com/zsb517/p/3409600.html
Copyright © 2011-2022 走看看