設計模式(c++):抽象工廠模式
- 介紹
- 概念
- 示例
-
- Father類(産品零件父類)
- 類(兩種規格的零件A)
- B類(兩種規格的零件B)
- FactoryFather類(工廠父類)
- FactoryModel1 類(生産類型I的産品零件)
- FactoryModel2 類(生産類型II的産品零件)
- main函數
- 概念圖
介紹
相比工廠方法模式抽象工廠方法模式對一類對象多同表現能夠更好處理。
工廠方法模式适用于一個工廠生産一個産品需求(各子工廠生産産品零件)的需求,抽象工廠模式适用于一個工廠生産多個産品(一個産品族)的需求(子工廠能夠生産不同型号的産品零件,每個子工廠能夠生産一種型号的産品)。
概念
提供一個接口,讓該接口負責建立一系列相關或者互相依賴的對象,兒無需指定他們具體的類。
示例
Father類(産品零件父類)
class Father
{
public:
Father() :num(0) { num = 0; }
Father(int number) :num(number) { cout << "Father::Father" << endl; }
virtual ~Father() {}
protected:
int num;
};
類(兩種規格的零件A)
class A_Model_1 :public Father
{
public:
A_Model_1() {}
A_Model_1(int number) :Father(number) //調用父類構造函數
{
cout << "A_Model_1::A_Model_1" << endl;
}
virtual ~A_Model_1() {}
};
class A_Model_2 :public Father
{
public:
A_Model_2() {}
A_Model_2(int number) :Father(number) //調用父類構造函數
{
cout << "A_Model_2::A_Model_2" << endl;
}
virtual ~A_Model_2() {}
};
B類(兩種規格的零件B)
class B_Model_1 :public Father
{
public:
B_Model_1() {}
B_Model_1(int number) :Father(number) //調用父類構造函數
{
cout << "B_Model_1::B_Model_1" << endl;
}
virtual~B_Model_1() {}
};
class B_Model_2 :public Father
{
public:
B_Model_2() {}
B_Model_2(int number) :Father(number) //調用父類構造函數
{
cout << "B_Model_2::B_Model_2" << endl;
}
virtual~B_Model_2() {}
};
FactoryFather類(工廠父類)
class FactoryFather
{
public:
virtual ~FactoryFather() {};
virtual Father* create_object_a() = 0;
virtual Father* create_object_b() = 0;
};
FactoryModel1 類(生産類型I的産品零件)
class FactoryModel1 :public FactoryFather
{
public:
virtual ~FactoryModel1() {};
virtual Father* create_object_a()
{
Father* object = nullptr;
cout << "FactoryModel1::create_object_a" << endl;
object = new A_Model_1(10);
/* 此處實作業務邏輯 */
return object;
}
virtual Father* create_object_b()
{
Father* object = nullptr;
cout << "FactoryModel1::create_object_b" << endl;
object = new B_Model_1(10);
/* 此處實作業務邏輯 */
return object;
}
};
FactoryModel2 類(生産類型II的産品零件)
class FactoryModel2 :public FactoryFather
{
public:
virtual ~FactoryModel2() {};
virtual Father* create_object_a()
{
Father* object = nullptr;
cout << "FactoryModel2::create_object_a" << endl;
object = new A_Model_2(100);
/* 此處實作業務邏輯 */
return object;
}
virtual Father* create_object_b()
{
Father* object = nullptr;
cout << "FactoryModel2::create_object_b" << endl;
object = new B_Model_2(100);
/* 此處實作業務邏輯 */
return object;
}
};
main函數
int main()
{
FactoryFather * factory_model1 = new FactoryModel1();
FactoryFather * factory_model2 = new FactoryModel2();
Father * a_mode1 = factory_model1->create_object_a();
Father * b_mode1 = factory_model1->create_object_b();
Father * a_mode2 = factory_model2->create_object_a();
Father * b_mode2 = factory_model2->create_object_b();
system("pause");
return 0;
}
執行結果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLiBjY0Y2NwYGZxI2YxIDMiJ2MmRzN5ImYkVjZ5AzMxczLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)