C++设计模式——工厂方法(factory method)

一、原理讲解

工厂方法是简单工厂的改进,改进之处是每款产品对应一个工厂,该工厂只生产这一种产品,也就是只创建这个产品类对象。

1.1意图

定义一个创建对象的接口,让子类决定实例化哪个类。该模式使类对象的创建延迟到子类。

1.2应用场景

  • 客户端不知道他所需要的对象的类;
  • 需要将类的实例延迟到子类中实现,并且一类产品有许多形态;

1.3结构图(UML图)

C++设计模式——工厂方法(factory method)_第1张图片 工厂方法UML图

1.4代码实现步骤

a1 定义一个抽象产品接口类IProduct,并且定义一个接口函数show()用于子类继承;(抽象产品类)

a2 定义两个实现接口类IProductA和IProductB,都重写接口函数show();(具体产品类)

a3 定义一个抽象接口工厂类IFactory,并且定义一个对象创建函数createProduct,唯一目的是被子类继承重写;(抽象工厂类)

a4 定义两个具体工厂类FactoryA和FactoryB,重写接口函数createProduct并且返回对应的产品类对象。(具体产品类)

二、实现代码

FactoryMethod.cpp

#include

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 

extern void doFactoryMethod();

int main()
{
	doFactoryMethod();

	system("pause");
	return 1;
}

C++设计模式——工厂方法(factory method)_第2张图片

 

三、优缺点

工厂方法可以解决一簇产品(一款产品有多种形态)的问题,并且工厂一次只能生产一种产品;但需要一个工厂能够同时生产多款产品时,则需要用到抽象工厂模式,可以参考博主的这篇博客: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:

你可能感兴趣的:(设计模式,c++,设计模式,工厂方法,factory,method)