大话设计模式-简单工厂模式、工厂方法模式、抽象工厂模式

时间:2022-10-01 23:03:46

简单工厂模式

概念:简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

适合应用于具有多个分支,不同的情况需要生成对应的类,将分支移到工厂类中,减少客户端的复杂度。但如果要新添加一个产品类的话,需要修改工厂类的代码。

 1 // OperationFactory.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 #include <string>
 7 using namespace std;
 8 
 9 class Operation{
10 private:
11     int numberA;
12     int numberB;
13 public:
14     void setNumberA(int a){
15         this->numberA = a;
16     }
17     void setNumberB(int b){
18         this->numberB = b;
19     }
20     int getNumberA(){
21         return numberA;
22     }
23     int getNumberB(){
24         return numberB;
25     }
26     virtual int getResult()=0;
27 };
28 
29 class OperationAdd:public Operation{
30 public:
31     int getResult(){
32         return (getNumberA() + getNumberB());
33     }
34 };
35 class OperationSub:public Operation{
36 public:
37     int getResult(){
38         return (getNumberA() - getNumberB());
39     }
40 };
41 class OperationMul:public Operation{
42 public:
43     int getResult(){
44         return (getNumberA() * getNumberB());
45     }
46 };
47 class OperationDiv:public Operation{
48 public:
49     int getResult(){
50         return (getNumberA() / getNumberB());
51     }
52 };
53 
54 class OperationFactory{
55 public:
56      Operation* createOperation(char ch){
57         Operation *p = NULL;
58         switch(ch){
59         case '+':
60             p = new OperationAdd();
61             break;
62         case '-':
63             p = new OperationSub();
64             break;
65         case '*':
66             p = new OperationMul();
67             break;
68         case '/':
69             p = new OperationDiv();
70             break;
71         }
72         return p;
73     }
74      //单例模式
75      static OperationFactory & getInstance(){
76          static OperationFactory of;
77          return of;
78      }
79 };
80 int _tmain(int argc, _TCHAR* argv[])
81 {
82     Operation *p;
83     p = OperationFactory::getInstance().createOperation('+');
84     p->setNumberA(2);
85     p->setNumberB(3);
86     cout << p->getResult()<< endl;
87     return 0;
88 }

 简单工厂模式在遇到新的类添加时,需要对工厂类进行修改,这未被了开放-封闭原则。

工厂方法模式:

概念:定义一个用于创建对象的接口,让子类决定实例化那一个类。工厂方法使得一个类的实例化延迟到其子类。

工厂方法模式是简单工厂模式的进一步抽象和推广,使用了多态性,保持了简单工厂模式的有点,也克服简单工厂模式的缺点。但是每增加一个类,就要对应的增加该类的工厂类。

 

  1 // OperationFactory.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 #include <string>
  7 using namespace std;
  8 
  9 class Operation{
 10 private:
 11     int numberA;
 12     int numberB;
 13 public:
 14     void setNumberA(int a){
 15         this->numberA = a;
 16     }
 17     void setNumberB(int b){
 18         this->numberB = b;
 19     }
 20     int getNumberA(){
 21         return numberA;
 22     }
 23     int getNumberB(){
 24         return numberB;
 25     }
 26     virtual int getResult()=0;
 27 };
 28 
 29 class OperationAdd:public Operation{
 30 public:
 31     int getResult(){
 32         return (getNumberA() + getNumberB());
 33     }
 34 };
 35 class OperationSub:public Operation{
 36 public:
 37     int getResult(){
 38         return (getNumberA() - getNumberB());
 39     }
 40 };
 41 class OperationMul:public Operation{
 42 public:
 43     int getResult(){
 44         return (getNumberA() * getNumberB());
 45     }
 46 };
 47 class OperationDiv:public Operation{
 48 public:
 49     int getResult(){
 50         return (getNumberA() / getNumberB());
 51     }
 52 };
 53 
 54 class IOperationFactory{
 55 public:
 56     virtual Operation * createOperation()=0;
 57 };
 58 class AddFactory:public IOperationFactory{
 59 
 60     Operation* createOperation(){
 61         return new OperationAdd();
 62     }
 63 };
 64 class SubFactory:public IOperationFactory{
 65     Operation* createOperation(){
 66         return new OperationSub();
 67     }
 68 };
 69 class MulFactory:public IOperationFactory{
 70     Operation* createOperation(){
 71         return new OperationMul();
 72     }
 73 };
 74 class DivFactory:public IOperationFactory{
 75     Operation* createOperation(){
 76         return new OperationDiv();
 77     }
 78 };
 79 //简单工厂模式
 80 class SimpleFactory{
 81 public:
 82     IOperationFactory *createOperationFactory(char ch){
 83         IOperationFactory *pf;
 84         switch (ch)
 85         {
 86         case '+': pf = new AddFactory();break;
 87         case '-': pf = new SubFactory();break;
 88         case '*': pf = new MulFactory();break;
 89         case '/': pf = new DivFactory();break;
 90         }
 91         return pf;
 92     }
 93     static SimpleFactory& createSimpleFactory(){
 94         static SimpleFactory sf;
 95         return sf;
 96     }
 97 };
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     IOperationFactory *pf = SimpleFactory::createSimpleFactory().createOperationFactory('+');
101     Operation *p = pf->createOperation();
102     p->setNumberA(2);
103     p->setNumberB(3);
104     cout << p->getResult()<< endl;
105     return 0;
106 }

 抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

适用场景:易于交换产品系列。让具体的创建实例过程与客服端分离,客户端通过他们的抽象接口操纵实例,产品的具体类名被具体工厂实现分离,不会出现在客户代码中。

 

  1 // OperationFactory.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include <iostream>
  6 #include <string>
  7 using namespace std;
  8 
  9 class IUser{
 10 
 11 public:
 12     virtual void inserUser()=0;
 13     virtual IUser* getUserByID(int id)=0;
 14 };
 15 class IDepartment{
 16 public:
 17     virtual void inserDepartment()=0;
 18     virtual IDepartment* getDepartmentByID(int id)=0;
 19 };
 20 class sqlUser:public IUser{
 21 public:
 22     void inserUser(){
 23         cout << "插入sqlUser"<< endl;
 24     }
 25     IUser *getUserByID(int id){
 26         cout << "得到id为"<<id<<"的sqluser"<<endl;
 27         return NULL;
 28     }
 29 };
 30 class oracleUser:public IUser{
 31 public:
 32     void inserUser(){
 33         cout << "插入oracleUser"<< endl;
 34     }
 35     IUser *getUserByID(int id){
 36         cout << "得到id为"<<id<<"的oracleUser"<<endl;
 37         return NULL;
 38     }
 39 };
 40 class sqlDepartment:public IDepartment{
 41 public:
 42     void inserDepartment(){
 43         cout << "插入sqlDepartment"<< endl;
 44     }
 45     IDepartment *getDepartmentByID(int id){
 46         cout << "得到id为"<<id<<"的sqlDepartment"<<endl;
 47         return NULL;
 48     }
 49 };
 50 class oracleDepartment:public IDepartment{
 51 public:
 52     void inserDepartment(){
 53         cout << "插入oracleDepartment"<< endl;
 54     }
 55     IDepartment *getDepartmentByID(int id){
 56         cout << "得到id为"<<id<<"的oracleDepartment"<<endl;
 57         return NULL;
 58     }
 59 };
 60 
 61 /*
 62 不使用简单工厂模式
 63 class IFactory{
 64 public :
 65     virtual IUser* createUser()=0;
 66     virtual IDepartment *createDepartment()=0;
 67 };
 68 class sqlFactory:public IFactory{
 69 public:
 70     IUser *createUser(){
 71         cout << "create sqlUser!"<<endl;
 72         return new sqlUser();
 73     }
 74     IDepartment *createDepartment(){
 75         cout << "create sqlDepartment!"<<endl;
 76         return new sqlDepartment();
 77     }
 78 };
 79 class oracleFactory:public IFactory{
 80 public:
 81     IUser *createUser(){
 82         cout << "create oracleUser!"<<endl;
 83         return new oracleUser();
 84     }
 85     IDepartment *createDepartment(){
 86         cout << "create oracleDepartment!"<<endl;
 87         return new oracleDepartment();
 88     }
 89 };*/
 90 //简单工厂模式
 91 class DataAccess{
 92 public:
 93 
 94     IUser * createUser(char ch){
 95         cout << "createUser" << endl;
 96         IUser *u;
 97         switch(ch){
 98         case 's': u = new sqlUser();break;
 99         case 'o': u = new oracleUser();break;
100         }
101         return u;
102     }
103 
104     IDepartment * createDepartment(char ch){
105         cout << "createDepartment" << endl;
106         IDepartment *d;
107         switch(ch){
108         case 's': d = new sqlDepartment();break;
109         case 'o': d = new oracleDepartment();break;
110         }
111         return d;
112     }
113     static DataAccess & createDataAccess(){
114         static DataAccess data;
115         return data;
116     }
117 };
118 int _tmain(int argc, _TCHAR* argv[])
119 {
120     //IFactory *f = new sqlFactory();
121     //IFactory *f = new oracleFactory();
122     char ch = 's';
123     IUser *u = DataAccess::createDataAccess().createUser(ch);
124     IDepartment *d = DataAccess::createDataAccess().createDepartment(ch);
125     u->inserUser();
126     d->inserDepartment();
127     return 0;
128 }