一、原理講解
工廠方法是簡單工廠的改進,改進之處是每款産品對應一個工廠,該工廠隻生産這一種産品,也就是隻建立這個産品類對象。
1.1意圖
定義一個建立對象的接口,讓子類決定執行個體化哪個類。該模式使類對象的建立延遲到子類。
1.2應用場景
- 用戶端不知道他所需要的對象的類;
- 需要将類的執行個體延遲到子類中實作,并且一類産品有許多形态;
1.3結構圖(UML圖)
工廠方法UML圖
1.4代碼實作步驟
a1 定義一個抽象産品接口類IProduct,并且定義一個接口函數show()用于子類繼承;(抽象産品類)
a2 定義兩個實作接口類IProductA和IProductB,都重寫接口函數show();(具體産品類)
a3 定義一個抽象接口工廠類IFactory,并且定義一個對象建立函數createProduct,唯一目的是被子類繼承重寫;(抽象工廠類)
a4 定義兩個具體工廠類FactoryA和FactoryB,重寫接口函數createProduct并且傳回對應的産品類對象。(具體産品類)
二、實作代碼
FactoryMethod.cpp
#include<iostream>
using namespace std;
#define DELETE(pointer) delete pointer; pointer=nullptr
class IProduct //抽象産品
{
public:
IProduct() {}
virtual ~IProduct() {}
virtual void show() = 0;
};
class ProductA : public IProduct //具體産品A
{
public:
ProductA() {}
~ProductA() {}
virtual void show() { cout << "ProductA" << endl; }
};
class ProductB : public IProduct //具體産品B
{
public:
ProductB() {}
~ProductB() {}
virtual void show() { cout << "ProductB" << endl; }
};
class IFactory //抽象工廠
{
public:
IFactory() {}
virtual ~IFactory() {}
virtual IProduct* createProduct() = 0;
};
class FactoryA : public IFactory //具體工廠
{
public:
FactoryA() {}
virtual ~FactoryA() {}
IProduct* createProduct() override{ return new ProductA;}
};
class FactoryB : public IFactory //具體工廠
{
public:
FactoryB() {}
virtual ~FactoryB() {}
IProduct* createProduct() override{ return new ProductB;}
};
void doFactoryMethod()
{
//生産産品A
IFactory *factory = new FactoryA();
IProduct *product = factory->createProduct();
product->show();
DELETE(product);
DELETE(factory);
//生産産品B
factory = new FactoryB();
product = factory->createProduct();
product->show();
DELETE(product);
DELETE(factory);
}
main.cpp
#include <iostream>
extern void doFactoryMethod();
int main()
{
doFactoryMethod();
system("pause");
return 1;
}
三、優缺點
工廠方法可以解決一簇産品(一款産品有多種形态)的問題,并且工廠一次隻能生産一種産品;但需要一個工廠能夠同時生産多款産品時,則需要用到抽象工廠模式,可以參考部落客的這篇部落格:c++設計模式--抽象工廠(abstract factory),同時工廠方法和抽象方法的差異對比也在這篇部落格上。
參考内容:
https://blog.csdn.net/qq_37221396/article/details/78361425(參考:應用場景)
https://www.cnblogs.com/huiz/p/8232783.html(參考:代碼實作)
https://www.bilibili.com/video/av22292899?from=search&seid=8813426322713310552(參考:哔哩哔哩C++設計模式!!!)
Erich Gamma,Richard Helm.《設計模式 可複用面向對象軟體的基礎》[M].機械工業出版社,2019: