zoukankan      html  css  js  c++  java
  • 添砖加瓦:设计模式(简单工厂模式)

      1、简单工厂模式中的角色和职责:

      工厂角色:简单工厂模式的核心,负责实现创建所有的实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象

      抽象产品角色:简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口

      具体产品角色:简单工厂模式所创建的具体实例对象

      2、简单工厂模式的优缺点:

      优点

      (1)实现了对象的创建和使用的分离

      (2)不需要记住具体类名,只需记住参数即可,减少记忆量

      缺点

      (1)工厂类的职责过重,一旦不能工作,系统会受到影响

      (2)增加系统中类的个数,复杂度和理解难度增加

      (3)违反“开闭原则”,增加新产品需要修改工厂逻辑,导致工厂越来越复杂

      3、适用场景

      (1)工厂类负责创建的对象较少。因为创建的对象少,所以不会造成工厂方法中的业务逻辑太过复杂

      (2)客户端只知道传入工厂类的参数,对于如何创建对象并不关心

      4、示例:

     1 #include <iostream>
     2 #include <string>
     3 
     4 using namespace std;
     5 
     6 //简单工厂模式
     7 /*
     8 *    定义一个人类抽象类,供具体工种实现和工厂使用
     9 */
    10 class Work
    11 {
    12 public:
    13     virtual void job() = 0;
    14 };
    15 
    16 //实例
    17 class Salesman :public Work
    18 {
    19 public:
    20     virtual void job()
    21     {
    22         cout << "I`m a Salesman" << endl;
    23     }
    24 };
    25 
    26 class Doctor : public Work
    27 {
    28     virtual void job()
    29     {
    30         cout << "I`m a Doctor" << endl;
    31     }
    32 };
    33 
    34 //现在添加一个教师类,则只需要再创建一个教师类
    35 class Teacher : public Work
    36 {
    37     virtual void job()
    38     {
    39         cout << "I`m a Teacher" << endl;
    40     }
    41 };
    42 
    43 //工厂类
    44 class Factory
    45 {
    46 public:
    47     Work* createWork(string work)
    48     {
    49         if (work == "Salesman")
    50             return new Salesman;
    51         else if (work == "Doctor")
    52             return new Doctor;
    53         /*
    54         *    当创建新的工作时,Factory会变得越来越大,不符合开闭原则
    55         */
    56         else if (work == "Teacher")
    57             return new Teacher;
    58     }
    59 };
    60 
    61 int main(int argc, char* argv[])
    62 {
    63     Factory *factory = new Factory;
    64     Work *work = NULL;
    65 
    66     /*
    67         ⽤⼯⼚创建⼀个具体工作类,返回抽象类指针
    68         那么这样就会发⽣多态。
    69         此时抽象类指针指向了具体的⼦类,那么调⽤抽象⽅法
    70         就会调⽤⼦类的实现⽅法。
    71     */
    72 
    73     work = factory->createWork("Salesman");
    74     work->job();
    75     delete work;
    76     work = NULL;
    77 
    78     work = factory->createWork("Doctor");
    79     work->job();
    80     delete work;
    81     work = NULL;
    82 
    83     work = factory->createWork("Teacher");
    84     work->job();
    85     delete work;
    86     work = NULL;
    87 
    88     delete factory;//避免内存泄漏
    89 
    90     getchar();
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    RSDS pdb格式
    关于windbg报错"No symbols for ntdll. Cannot continue."问题
    WinDbg常用命令系列---.cmdtree
    正确创建本地C++发布构建PDBS
    PDB文件会影响性能吗?
    每个开发人员必须知道PDB文件知识
    Windbg妙用
    在x64计算机上捕获32位进程的内存转储
    为什么我的堆栈上会有奇怪的函数名?(关于符号的讨论)
    redis入门基础
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/7712003.html
Copyright © 2011-2022 走看看