一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

设计模式之工厂方法模式

工厂方法模式,定义一个用于创建对象的接口,让子类决定实力化哪一个类。工厂方法使一个类的实例化延迟到其子类。其UML图如下:

  这里要区分一下工厂方法模式与简单工厂模式的区别。简单工厂模式需要在工厂类中判断要生产什么类型的对象。工厂方法模式则把这部分工作交给了客户端。每一种类对象都有自己的工厂,客户端根据自己的不同需要生成不同工厂,然后在生产自己需要的对象。工厂方法模式相对简单工厂模式来说降低了类与客户端的耦合度。最重要的一点是当需要添加其他的类的时候不用修改原来的代码。只需用添加响应的工厂就行了和类就行了。这样做遵循了开放-封闭原则。而简单工厂模式实际是破坏了开放-封闭原则。

其代码如下:

  1 // FactoryMethodModel.h文件
  2 #pragma once
  3 #include <iostream>
  4 // 操作类
  5 template<typename T>
  6 class Operation
  7 {
  8 public:
  9     Operation(const T &lpa, const T &rpa)
 10     {
 11         this->lpa = lpa;
 12         this->rpa = rpa;
 13     }
 14     virtual T getResult() = 0;
 15 protected:
 16     T lpa, rpa;
 17 };
 18 //加法操作
 19 template<typename T>
 20 class AddOperation : public Operation<T>
 21 {
 22 public:
 23     AddOperation(const T lpa, const T rpa) : Operation<T>(lpa, rpa)
 24     {
 25         ;
 26     }
 27     virtual T getResult()
 28     {
 29         return this->lpa + this->rpa;
 30     }
 31 };
 32 // 减法操作
 33 template<typename T>
 34 class SubOperation : public Operation<T>
 35 {
 36 public:
 37     SubOperation(const T lpa, const T rpa) : Operation<T>(lpa, rpa)
 38     {
 39         ;
 40     }
 41     virtual T getResult()
 42     {
 43         return this->lpa - this->rpa;
 44     }
 45 };
 46 // 乘法操作
 47 template<typename T>
 48 class MulOperation : public Operation<T>
 49 {
 50 public:
 51     MulOperation(const T lpa, const T rpa) : Operation<T>(lpa, rpa)
 52     {
 53         ;
 54     }
 55     virtual T getResult()
 56     {
 57         return this->lpa * this->rpa;
 58     }
 59 };
 60 // 除法操作
 61 template<typename T>
 62 class DivOperation : public Operation<T>
 63 {
 64 public:
 65     DivOperation(const T lpa, const T rpa) : Operation<T>(lpa, rpa)
 66     {
 67         ;
 68     }
 69     virtual T getResult()
 70     {
 71         if (0 == this->rpa)
 72         {
 73             std::cout << "除数不能为0" << std::endl;
 74             return 0;
 75         }
 76         return this->lpa / this->rpa;
 77     }
 78 };
 79 // 工厂类
 80 template<typename T>
 81 class Factory
 82 {
 83 public:
 84     virtual Operation<T> * createObject(const T &lpa, const T &rpa) = 0;
 85 };
 86 // 加法工厂
 87 template<typename T>
 88 class AddFactory : public Factory<T>
 89 {
 90 public:
 91     virtual Operation<T> * createObject(const T &lpa,const T &rpa)
 92     {
 93         return new AddOperation<T>(lpa, rpa);
 94     }
 95 };
 96 // 减法工厂
 97 template<typename T>
 98 class SubFactory : public Factory<T>
 99 {
100 public:
101     virtual Operation<T> * createObject(const T &lpa, const T &rpa)
102     {
103         return new SubOperation<T>(lpa, rpa);
104     }
105 };
106 // 乘法工厂
107 template<typename T>
108 class MulFactory : public Factory<T>
109 {
110 public:
111     virtual Operation<T> * createObject(const T &lpa, const T &rpa)
112     {
113         return new MulOperation<T>(lpa, rpa);
114     }
115 };
116 // 除法工厂
117 template<typename T>
118 class DivFactory : public Factory<T>
119 {
120 public:
121     virtual Operation<T> * createObject(const T &lpa,const T &rpa)
122     {
123         return new DivOperation<T>(lpa, rpa);
124     }
125 };

测是代码如下:

 1 #include <iostream>
 2 #include "FactoryMethodModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 工厂方法模式,与简单工厂模式的区别就是简单工厂模式中需要由工厂
 8     // 来判断生成什么类型的Operation,而工厂方法模式则由客户端来判断
 9     // 需要什么类型的操作则创建什么样的工厂,这样耦合度更低。添加类型
10     // 方法类型的时候不用修改原来的代码,遵从了开放-封闭原则。
11     double a = 1384.348, b = 109348.9785234;
12 
13     Factory<double> *p = new AddFactory<double>;
14     Operation<double> * oper = p->createObject(a, b);
15     double d = oper->getResult();
16     cout << oper->getResult() << endl;
17     delete oper;
18     delete p;
19 
20     p = new SubFactory<double>;
21     oper = p->createObject(a, b);
22     cout << oper->getResult() << endl;
23     delete oper;
24     delete p;
25 
26     p = new MulFactory<double>;
27     oper = p->createObject(a, b);
28     cout << oper->getResult() << endl;
29     delete oper;
30     delete p;
31 
32     p = new DivFactory<double>;
33     oper = p->createObject(a, b);
34     cout << oper->getResult() << endl;
35     delete oper;
36     delete p;
37     
38     getchar();
39     return 0;
40 }

测试结果如下图:

 

posted on 2023-07-07 14:05  一杯清酒邀明月  阅读(27)  评论(0编辑  收藏  举报