天天看點

C++設計模式——工廠方法(factory method)

一、原理講解

工廠方法是簡單工廠的改進,改進之處是每款産品對應一個工廠,該工廠隻生産這一種産品,也就是隻建立這個産品類對象。

1.1意圖

定義一個建立對象的接口,讓子類決定執行個體化哪個類。該模式使類對象的建立延遲到子類。

1.2應用場景

  • 用戶端不知道他所需要的對象的類;
  • 需要将類的執行個體延遲到子類中實作,并且一類産品有許多形态;

1.3結構圖(UML圖)

C++設計模式——工廠方法(factory method)

工廠方法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++設計模式——工廠方法(factory method)

三、優缺點

工廠方法可以解決一簇産品(一款産品有多種形态)的問題,并且工廠一次隻能生産一種産品;但需要一個工廠能夠同時生産多款産品時,則需要用到抽象工廠模式,可以參考部落客的這篇部落格: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:

繼續閱讀