zoukankan      html  css  js  c++  java
  • 设计模式(创建)--简单工厂

    在我还不太懂设计模式的时候,代码写的非常混乱,往往都是拍拍脑袋就写代码,写到哪里算哪里,不行就往死里改,效率低下。当然学习设计模式的过程也十分有趣,可是说是建立自己设计思维的基石。在学习的时候,不但要充分思考这样设计的方案好在哪里差在哪里,更关键的是,要动手去写,否则只是理解表层的东西,很难做到融会贯通。

    学习设计模式的过程:

    1. 创建型模式

    2. 结构型模式

    3. 行为模式

    现在,我们就先从创建型模式开始:所谓创建型模式,就是指构建类对象。帮助系统隔离开“如何创建?”、“如何组合?”、“表示的对象?”。

    我们既然使用了C++,就需要充分使用面向对象的优越性,那就是通过封装、继承、多态来把程序的耦合度降低,提高程序的灵活性和复用性。

    废话不多说了,直接开始关于简单工厂的实现。

    简单工厂模式UML图:

    1. 只有1个产品对象的简单工厂模式

    2. 带有1个抽象产品对象的简单工厂模式

    因为是简单工厂模式,所以设计上只有一个工厂,或者说只有一种类型的工厂,没办法,都说是“简单”了,几个工厂就不叫简单了。

    简单工厂的目的仅仅聚焦于:

    抽象出产品,然后根据产品需求创建不同产品对象

    image

     1 /************************************************************************/
     2 /*                简单实现                                                */
     3 /************************************************************************/
     4 int main(int argc, char* argv[])
     5 {
     6     // 创建工厂
     7     CFactory cFactory;
     8     CProduct *pcPro;
     9     pcPro = cFactory.CreateProduct(PRODUCT_TYPE_3);
    10     pcPro->ProductBehavior();
    11     pcPro = cFactory.CreateProduct(PRODUCT_TYPE_1);
    12     pcPro->ProductBehavior();
    13     pcPro = cFactory.CreateProduct(PRODUCT_TYPE_2);
    14     pcPro->ProductBehavior();
    15 
    16     printf("Hello World!
    ");
    17     return 0;
    18 }
     1 /************************************************************************/
     2 /*                  简单工厂模式模板                                    */
     3 /************************************************************************/
     4 
     5 enum emProductType
     6 {
     7     PRODUCT_TYPE_1 = 0,
     8     PRODUCT_TYPE_2,
     9     PRODUCT_TYPE_3
    10 };
    11 
    12 class CFactory
    13 {
    14 public:
    15     CFactory(){};
    16     // 抽象创建产品
    17     CProduct* CreateProduct(int wParam)
    18     {
    19         switch(wParam)
    20         {
    21         case PRODUCT_TYPE_1:
    22             return new CProductA();
    23         case PRODUCT_TYPE_2:
    24             return new CProductB();
    25         case PRODUCT_TYPE_3:
    26             return new CProductC();
    27         default:
    28             break;;
    29         }
    30         return 0;
    31     };
    32 protected:
    33 private:
    34 };
     1 /**************
     2  * 抽象产品类 *
     3  **************/
     4 class CProduct
     5 {
     6 public:
     7     virtual BOOL ProductBehavior(void){return TRUE;};
     8     int m_wParam;
     9 protected:
    10 private:
    11 };
    12 
    13 /**************
    14  * 产品-A      *
    15  **************/
    16 class CProductA : public CProduct
    17 {
    18 public:
    19     CProductA()
    20     {
    21         m_wParam = 1;
    22         m_wParamA = 1;
    23     }
    24     BOOL ProductBehavior(void)
    25     {
    26         printf("m_wParam:%d,m_wParamA:%d
    ", m_wParam,m_wParamA);
    27         return TRUE;
    28     };
    29 protected:
    30 private:
    31     int m_wParamA;
    32 };
    33 
    34 /**************
    35  * 产品-B      *
    36  **************/
    37 class CProductB : public CProduct
    38 {
    39 public:
    40     CProductB()
    41     {
    42         m_wParam = 2;
    43         m_wParamB = 2;
    44     }
    45     BOOL ProductBehavior(void)
    46     {
    47         printf("m_wParam:%d,m_wParamB:%d
    ", m_wParam,m_wParamB);
    48         return TRUE;
    49     };
    50 protected:
    51 private:
    52     int m_wParamB;
    53 };
    54 
    55 /**************
    56  * 产品-C      *
    57  **************/
    58 class CProductC : public CProduct
    59 {
    60 public:
    61     CProductC()
    62     {
    63         m_wParam = 3;
    64         m_wParamC = 4;
    65         m_wMathC = 5;
    66     }
    67     BOOL ProductBehavior(void)
    68     {
    69         printf("m_wParam:%d,m_wParamC:%d,m_wMathC:%d
    ", m_wParam,m_wParamC,m_wMathC);
    70         return TRUE;
    71     };
    72 protected:
    73 private:
    74     int m_wParamC;
    75     int m_wMathC;
    76 };

    最后的实现结果:

    image 

    这里需要说明下main函数里,关于使用CProduct *:父类指针指向子类对象

    1.如果一个父类指针指向一个子类对象,那么经由该指针只能访问基础类定义的函数;

    2.如果一个子类指针指向一个父类对象,这样尽量避免;

    3.如果定义了相同名称的成员函数,那么通过对象指针调用成员函数时,调用哪个函数,取决于指针类型来决定,而不是实际对象决定;

    如果父类接口是虚函数,那么就不同了,父类指针指向了子类对象,那么实现的就是子类的方法;如果父类指针指向父类对象,那么实现的仍是父类方法;

  • 相关阅读:
    Appium安装教程
    方法(method)和函数(function)有什么区别?
    FTP两种工作模式:主动模式(Active FTP)和被动模式介绍
    python socket编程介绍
    面向对象基础篇
    python fishc.homework2
    python遇到的问题汇总
    我对 python 面向对象的理解
    深入理解JVM(五)JVM优化策略
    深入理解JVM(四)JVM性能监控与故障处理工具
  • 原文地址:https://www.cnblogs.com/davidsguo008/p/3615616.html
Copyright © 2011-2022 走看看