C++设计模式——工厂方法(factory method)
一、原理讲解
工厂方法是简单工厂的改进,改进之处是每款产品对应一个工厂,该工厂只生产这一种产品,也就是只创建这个产品类对象。
1.1意图
定义一个创建对象的接口,让子类决定实例化哪个类。该模式使类对象的创建延迟到子类。
1.2应用场景
- 客户端不知道他所需要的对象的类;
- 需要将类的实例延迟到子类中实现,并且一类产品有许多形态;
1.3结构图(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:
更多推荐
所有评论(0)