1. 程式人生 > >《大話設計模式》c++實現 抽象工廠模式

《大話設計模式》c++實現 抽象工廠模式

 

為了更清晰地理解工廠方法模式,需要先引入兩個概念:

  • 產品等級結構 :產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
  • 產品族 :在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。

抽象工廠模式包含如下角色:

  • AbstractFactory:抽象工廠
  • ConcreteFactory:具體工廠
  • AbstractProduct:抽象產品
  • Product:具體產品

../_images/AbatractFactory.jpg

 

 

在上例中,產品族包括兩個:1和2,也就是Sqlserver資料庫和Access資料庫。

每個產品族裡面又包含兩類產品:A和B,也就是User表和Department表。

而每個產品族中的產品要一起使用,就是說產品族1中的兩類產品A和B要一起使用,也就是說在SqlServer資料庫中SqlServerUser表和SqlServerDepartment表要一起使用,Access資料庫同理。

 

工廠角度:

SqlFactory:

  User:

    //具體產品A1 SqlProductA

  Department:

    //具體產品B1 SqlProductB
 AccessFactory:

  User:    

    //具體產品A2 AccessProductA

  Department:

    //具體產品B2 AccessProductB

 

 產品角度:

AbstractProductA(user 表):

  //具體產品A1 SqlProductA

  //具體產品A2 AccessProductA

 

AbstractProductB(Department表)

  

    //具體產品B1 SqlProductA

  //具體產品B2 AccessProductA

  1 #include<string>
  2 #include<iostream>
  3 
  4 
  5 
  6 //資料庫表項:User  與工廠模式無關
  7 class User
  8 {
  9 private:
 10     int id;
 11     std::string name;
 12 public:
 13     int getID()
 14     {
 15         return id;
 16     }
 17     std::string getName()
 18     {
 19         return name;
 20     }
 21     void setID(int ID)
 22     {
 23         this->id = ID;
 24     }
 25     void setName(std::string NAME)
 26     {
 27         this->name = NAME;
 28     }
 29 };
 30 
 31 
 32 //資料庫表項:Department 與工廠模式無關
 33 class Department
 34 {
 35 private:
 36     int id;
 37     std::string name;
 38 public:
 39     int getID()
 40     {
 41         return id;
 42     }
 43     std::string getName()
 44     {
 45         return name;
 46     }
 47     void setID(int ID)
 48     {
 49         this->id = ID;
 50     }
 51     void setName(std::string NAME)
 52     {
 53         this->name = NAME;
 54     }
 55 };
 56 
 57 
 58 
 59 
 60 //抽象產品A:IUser
 61 class AbstractProductA{
 62 public:
 63     virtual void  Insert(User user) = 0;
 64     virtual User* GetUser(int id) = 0;
 65 };
 66 
 67 //具體產品A1 SqlProductA
 68 class SqlProductA :public AbstractProductA{
 69 public:
 70     void  Insert(User user){
 71         std::cout << "在SQL Server中給User表增加了一條記錄" << std::endl;
 72     }
 73     User*  GetUser(int id){
 74         std::cout << "在SQL Server中得到id為:"<<id<<" User表一條記錄" << std::endl;
 75         return NULL;
 76     }
 77 };
 78 //具體產品A2 AccessProductA
 79 class AccessProductA :public AbstractProductA{
 80 public:
 81     void  Insert(User user){
 82         std::cout << "在Access中給User表增加了一條記錄" << std::endl;
 83     }
 84     User*  GetUser(int id){
 85         std::cout << "在Access中得到id為:" << id << " User表一條記錄" << std::endl;
 86         return NULL;
 87     }
 88 };
 89 
 90 //抽象產品B:IDepartment
 91 class AbstractProductB{
 92 public:
 93     virtual void  Insert(Department department) = 0;
 94     virtual  Department* GetDepartment(int id) = 0;
 95 };
 96 
 97 
 98 //具體產品B1 SqlProductB
 99 class SqlProductB :public AbstractProductB{
100 public:
101     void  Insert(Department department){
102         std::cout << "在SQL Server中給department表增加了一條記錄" << std::endl;
103     }
104      Department* GetDepartment(int id){
105         std::cout << "在SQL Server中得到id為:" << id << " Department表一條記錄" << std::endl;
106         return NULL;
107      }
108 };
109 
110 
111 //具體產品B2 AccessProductB
112 class AccessProductB :public AbstractProductB{
113 public:
114     void  Insert(Department department){
115         std::cout << "在Access中給department表增加了一條記錄" << std::endl;
116     }
117     Department*  GetDepartment(int id){
118         std::cout << "在Access中得到id為:" << id << " Department表一條記錄" << std::endl;
119         return NULL;
120     }
121 };
122 
123 
124 class AbstractFactory{
125 public:
126     virtual AbstractProductA* createProductA() = 0;
127     virtual AbstractProductB* createProductB() = 0;
128 };
129 
130 //具體工廠1:SqlServerFactory
131 class SqlFactory :public AbstractFactory
132 {
133 public:
134     AbstractProductA* createProductA()
135     {
136         return new SqlProductA;
137     }
138     AbstractProductB* createProductB()
139     {
140         return new SqlProductB;
141     }
142 };
143 
144 //具體工廠2:AccessFactory
145 class AccessFactory :public AbstractFactory{
146 public:
147     AbstractProductA* createProductA()
148     {
149         return new AccessProductA;
150     }
151     AbstractProductB* createProductB()
152     {
153         return new AccessProductB;
154 
155     }
156 };
157 
158 
159 void main()
160 {
161     //初始化資料庫
162     User user;
163     Department department;
164 
165     //ConcreteFactory1
166     AbstractFactory* factory = NULL;
167     //factory = new SqlFactory;
168     factory = new AccessFactory;
169     //ProductA1
170     AbstractProductA* iu = NULL;
171     iu = factory->createProductA();
172     iu->Insert(user);
173     iu->GetUser(1);
174 
175     //ProductB1
176     AbstractProductB* id = NULL;
177     id = factory->createProductB();
178     id->Insert(department);
179     id->GetDepartment(1);
180 
181     if (factory != NULL)
182     {
183         delete factory;
184         factory = NULL;
185     }
186     if (iu != NULL)
187     {
188         delete iu;
189         iu = NULL;
190     }
191     if (id != NULL)
192     {
193         delete id;
194         id = NULL;
195     }
196 
197     system("pause");
198 
199     
200 
201 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html

https://blog.csdn.net/xiqingnian/article/details/41181995