zoukankan      html  css  js  c++  java
  • 工厂模式

    工厂模式的作用:用于生产类对象

    工厂模式分类:简单工厂模式、工厂模式、抽象工厂模式

    工厂模式的特点:

      (1)工厂模式是一种设计模式,遵循开闭原则,

                –   开放, 对新增的功能是开放的。

                     –   关闭, 对以前的已经完成的功能时不允许修改的。

            (2)封装对象的创建过程,可以轻而易举的获得一个可用的对象。

            (3)解耦合,降低类和类之间的耦合度,修改一个类不会影响另一个类。

            (4)降低代码的重复性,提高代码的可读性


     下面主要介绍常用的工厂模式, 简单工厂模式和抽象工厂模式在此不介绍,感兴趣的可以自行学习。

     工厂模式遵循开闭原则:

        –   每创建一个对象, 就应该对应一个工厂类, 工厂类需要有很多个

        –     这些创建对象的工厂类之间是什么关系?

        • 兄弟关系

        –   这些创建对象的工厂类需要有相同的基类

        • 目的: 为了实现多态, 让代码的调用更加灵活

    工厂模式使用流程

      1. 创建一个工厂类的基类, 在这个基类中添加一个虚函数, 这个虚函数就是用于对象创建的工厂函数。

      2. 基于这个工厂类创建若干个子工厂类, 在子工厂类中实现父类的虚函数。

      3. 如果需要创建更多的对象, 再次添加子工厂类即可。

    工厂模式的特点: 对于已经实现的代码是不做任何修改的, 如果有新的需求, 添加新的代码。


     工厂模式实现代码:

      1 // 对象基类
      2 #include <cstdlib>
      3 #include <iostream>
      4 using namespace std;
      5 class BaseObject
      6 {
      7 public:
      8     BaseObject();
      9     ~BaseObject();
     10     virtual void funcA()
     11     {
     12         cout << "BaseObject-----funcA" << endl;
     13     }
     14 
     15 private:
     16 
     17 };
     18 
     19 BaseObject::BaseObject()
     20 {
     21 }
     22 
     23 BaseObject::~BaseObject()
     24 {
     25 }
     26 /*******************************/
     27 class AObject:public BaseObject
     28 {
     29 public:
     30     AObject();
     31     ~AObject();
     32     void funcA();
     33 
     34 private:
     35 
     36 };
     37 
     38 AObject::AObject()
     39 {
     40 }
     41 
     42 AObject::~AObject()
     43 {
     44 }
     45 
     46 void AObject::funcA()
     47 {
     48     cout << "AObject --- funcA" << endl;
     49 }
     50 
     51 /*************************/
     52 class BObject:public BaseObject
     53 {
     54 public:
     55     BObject();
     56     ~BObject();
     57     void funcA();
     58 
     59 private:
     60 
     61 };
     62 
     63 BObject::BObject()
     64 {
     65 }
     66 
     67 BObject::~BObject()
     68 {
     69 }
     70 void BObject::funcA()
     71 {
     72     cout << "BObject----funcA" << endl;
     73 }
     74 
     75 
     76 /*************************************************************/
     77 // 工厂类基类
     78 class BaseFactory
     79 {
     80 public:
     81     BaseFactory();
     82     ~BaseFactory();
     83     // 创建对象的工厂方法
     84     virtual BaseObject* createObject()
     85     {
     86         cout << "BaseFactory --- createObject" << endl;
     87         return NULL;
     88     }
     89 
     90 private:
     91 
     92 };
     93 
     94 BaseFactory::BaseFactory()
     95 {
     96 }
     97 
     98 BaseFactory::~BaseFactory()
     99 {
    100 }
    101 /**********************************************************/
    102 // 子工厂类, 只生产AObject类对象
    103 class AFactory:public BaseFactory
    104 {
    105 public:
    106     AFactory();
    107     ~AFactory();
    108 
    109     BaseObject* createObject();
    110 
    111 private:
    112 
    113 };
    114 
    115 AFactory::AFactory()
    116 {
    117 }
    118 
    119 AFactory::~AFactory()
    120 {
    121 }
    122 
    123 BaseObject* AFactory::createObject()
    124 {
    125     cout << "AFactory---createObject" << endl;
    126     BaseObject* c = new AObject;
    127     return c;
    128 }
    129 
    130 /***************************************************/
    131 class BFactory:public BaseFactory
    132 {
    133 public:
    134     BFactory();
    135     ~BFactory();
    136     BaseObject* createObject();
    137 
    138 private:
    139 
    140 };
    141 
    142 BFactory::BFactory()
    143 {
    144 }
    145 
    146 BFactory::~BFactory()
    147 {
    148 }
    149 
    150 BaseObject* BFactory::createObject()
    151 {
    152     cout << "BFactory----createObject" << endl;
    153     BaseObject* c = new BObject();
    154     return c;
    155 }
    156 
    157 /*************************************************************/
    158 int main()
    159 {
    160     // 工厂类使用
    161     BaseFactory* bf = new AFactory();
    162     BaseObject* ao = bf->createObject();
    163     ao->funcA();
    164 
    165     bf = new BFactory();
    166     ao = bf->createObject();
    167     ao->funcA();
    168 
    169     system("pause");
    170     return EXIT_SUCCESS;
    171 }

     

  • 相关阅读:
    缺失的第一个正数
    tuple用法
    整数转罗马数字
    三种时间格式的转换
    不同包的调用
    正则表达式
    lgb模板
    线性回归
    时间序列的特征
    3D聚类
  • 原文地址:https://www.cnblogs.com/qingpeng/p/13548663.html
Copyright © 2011-2022 走看看