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

    工厂方法模式(Factory Method):定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

    结构图:

    图解:一个具体的产品,对应一个工厂子类。同时,解决了工厂类与分支的耦合。

      简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断(也是工厂类中的耦合),根据客户端的选择条件实例化相关的类,对于客户端来说,去除了与具体产品的以来。

      例子:

      计算器的简单工厂模式结构图:

     

      计算器的工厂方法模式结构图:

    增加方法时,只需扩展,不需修改(开-闭模式)

    优点:“工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建原则的优点。”

    缺点:“工厂模式实现时,客户端需要决定哪一个工厂来实例化运算类,选择判断问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是改工厂类的,而现在是修改客户端。”

    计算器方法工程模式C++代码实现
    1 #include <iostream>
    2 #include <string>
    3
    4  using std::string;
    5  using std::cout;
    6 using std::endl;
    7
    8 template<class T>
    9 class Operation
    10 {
    11 public:
    12 Operation()
    13 {
    14 numberA = 0;
    15 numberB = 0;
    16 }
    17 virtual T GetResult()
    18 {
    19 T result = 0;
    20 return result;
    21 }
    22 public:
    23 T numberA;
    24 T numberB;
    25 };
    26
    27 template<class T>
    28 class OperationAdd : public Operation<T>
    29 {
    30 public:
    31 T GetResult()
    32 {
    33 return numberA + numberB;
    34 }
    35 };
    36
    37 template<class T>
    38 class OperationMinus : public Operation<T>
    39 {
    40 public:
    41 T GetResult()
    42 {
    43 return numberA - numberB;
    44 }
    45 };
    46
    47 template<class T>
    48 class OperationMultiply : public Operation<T>
    49 {
    50 public:
    51 T GetResult()
    52 {
    53 return numberA * numberB;
    54 }
    55 };
    56
    57 template<class T>
    58 class OperationDivide : public Operation<T>
    59 {
    60 public:
    61 T GetResult()
    62 {
    63 return numberA / numberB;
    64 }
    65 };
    66
    67
    68 /*//简单工厂模式的工厂类
    69 template<class T>
    70 class OperationFactory
    71 {
    72 public:
    73 static Operation<T>* CreateOperate(string operate) //根据客户需要,返回一个产品
    74 {
    75 Operation<T>* oper = NULL;
    76 if(operate == "+")
    77 {
    78 oper = new OperationAdd<T>();
    79 }
    80 else if(operate == "-")
    81 {
    82 oper = new OperationMinus<T>();
    83 }
    84 else if(operate == "*")
    85 {
    86 oper = new OperationMultiply<T>();
    87 }
    88 else if(operate == "/")
    89 {
    90 oper = new OperationDivide<T>();
    91 }
    92 else //默认产生的是加法运算
    93 {
    94 oper = new OperationAdd<T>();
    95 }
    96
    97 return oper;
    98
    99 }
    100 };
    101 */
    102 //抽象工厂接口类
    103 template<class T>
    104 class IFactory
    105 {
    106 public:
    107 virtual Operation<T>* CreateOperate() = 0;
    108 };
    109
    110 //加减乘除各建一个具体工厂去实现这个接口
    111 template<class T>
    112 class AddFactory : public IFactory<T>
    113 {
    114 public:
    115 Operation<T>* CreateOperate()
    116 {
    117 return new OperationAdd<T>();
    118 }
    119 };
    120
    121 template<class T>
    122 class MinusFactory : public IFactory<T>
    123 {
    124 public:
    125 Operation<T>* CreateOperate()
    126 {
    127 return new OperationMinus<T>();
    128 }
    129 };
    130
    131 template<class T>
    132 class MultiplyFactory : public IFactory<T>
    133 {
    134 public:
    135 Operation<T>* CreateOperate()
    136 {
    137 return new OperationMultiply<T>();
    138 }
    139 };
    140
    141 template<class T>
    142 class DevideFactory : public IFactory<T>
    143 {
    144 public:
    145 Operation<T>* CreateOperate()
    146 {
    147 return new OperationDevide<T>();
    148 }
    149 };
    150
    151 int main()
    152 {
    153 /*//简单工厂模式的客户端
    154 Operation<int>* oper = OperationFactory<int>::CreateOperate("+");
    155 oper->numberA = 100;
    156 oper->numberB = 200;
    157 double result = oper->GetResult();
    158 cout<<result<<endl;
    159 */
    160
    161 //工厂方法模式的客户端
    162 IFactory<int>* operFactory = new AddFactory<int>();
    163 Operation<int>* oper = operFactory->CreateOperate();
    164 oper->numberA = 100;
    165 oper->numberB = 200;
    166 double result = oper->GetResult();
    167 cout<<result<<endl;
    168 return 0;
    169 }
  • 相关阅读:
    2020牛客多校第三场 G
    Travel Guide
    jQuery属性选择器中加变量
    css 两大特性:继承性和层叠性
    css 伪元素选择器
    css 伪类选择器
    css属性选择器
    css的高级选择器,后代选择器,子代选择器,并集选择器,交集选择器
    css 引入方式以及css的选择器
    HTML
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/1721942.html
Copyright © 2011-2022 走看看