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

      1、工厂方法模式中的角色和职责

      抽象工厂角色工厂方法模式的核心,任何工厂类都必须实现这个接口。

      工厂角色具体工厂类是抽象工厂的一个实现,负责实例化产品对象。

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

      具体产品角色工厂方法模式所创建的具体实例对象

      简单工厂模式 + “开闭原则” = 工厂方法模式

      2、工厂方法模式优缺点

      优点

      (1) 不需要记住具体类名,甚至连具体参数都不用记忆。
      (2) 实现了对象创建和使用的分离。
      (3)系统的可扩展性也就变得非常好,无需修改接口和原类。

      缺点

      (1)增加系统中类的个数,复杂度和理解难度增加。
      (2) 增加了系统的抽象性和理解难度。

      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 */
    18 class abstractFactory
    19 {
    20 public:
    21     virtual Work *createJob() = 0;
    22 };
    23 
    24 //实例
    25 class Salesman :public Work
    26 {
    27 public:
    28     virtual void job()
    29     {
    30         cout << "I`m a Salesman" << endl;
    31     }
    32 };
    33 
    34 //实现抽象工厂,返回抽象工作指针
    35 class abstractSalesman : public abstractFactory
    36 {
    37 public:
    38     virtual Work *createJob()
    39     {
    40         return new Salesman;
    41     }
    42 };
    43 
    44 /*
    45     此时,若想添加一个医生类,那么只需要实现一个医生工厂和一个医生具体类,并不需要修改已有的代码
    46 */
    47 class Doctor : public Work
    48 {
    49     virtual void job()
    50     {
    51         cout << "I`m a Doctor" << endl;
    52     }
    53 };
    54 class abstractDoctor : public abstractFactory
    55 {
    56 public:
    57     virtual Work *createJob()
    58     {
    59         return new Doctor;
    60     }
    61 };
    62 
    63 int main(int argc, char* argv[])
    64 {
    65     /*
    66         依赖倒转原则, 是针对接⼝的编程,
    67         那么,何为针对接⼝?
    68         即只需要 使⽤ 抽象⼯⼚类的指针,和抽象⽔果类的指针,
    69         通过多态的特性,就可以搞定完成具体类的业务。
    70     */
    71 
    72     abstractFactory *abFactory = NULL;
    73     Work *work = NULL;
    74 
    75     /*
    76         使用抽象指针完成售货员业务
    77     */
    78     abFactory = new abstractSalesman;
    79     work = abFactory->createJob();
    80     work->job();
    81     delete abFactory;
    82     delete work;
    83 
    84     /*
    85         使用抽象指针完成医生业务
    86     */
    87     abFactory = new abstractDoctor;
    88     work = abFactory->createJob();
    89     work->job();
    90     delete abFactory;
    91     delete work;
    92 
    93 
    94     getchar();
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    [每日一题2020.06.23]leetcode #16 双指针
    typora+picgo+jsdeliver+github打造免费高效的博客图床
    [javaSE笔记5]String
    [javaSE笔记4] ArrayList
    [javaSE笔记3] JAVA的继承---多态 抽象
    [每日一题2020.06.22]leetcode #11 双指针
    操作系统---设备管理
    [每日一题2020.06.21]leetcode #124 DFS二叉树
    操作系统---磁盘
    PC实用工具推荐
  • 原文地址:https://www.cnblogs.com/lianshuiwuyi/p/7712312.html
Copyright © 2011-2022 走看看