C++23种设计模式(1)-工厂方法模式

设计模式 专栏收录该内容
23 篇文章 2 订阅

C++常用的设计模式有23种。
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
为了引入工厂方式模式,我们首先来看一个简单工厂模式,注意简单工厂模式不属于23种设计模式之一,因为简单工厂模式是有缺陷的。下面来看一个简单工厂模式例子。

#include<iostream>
#include<string>
using namespace std;
enum CTYPE{COREA,COREB};
//定义一个基类单核
class SingleCore 
{
public:
	virtual void show() = 0;
};
//单核A
class SingleCoreA:public SingleCore
{
public:
	void show() {
		cout << "SingleCore A" << endl;
	}
};
//单核B
class SingleCoreB:public SingleCore
{
public:
	void show() {
		cout << "SingleCore B" << endl;
	}
};
//唯一的工厂,可以生成A、B两种处理器核,在内部判断
class Factory {
public:
	//基类的对象指针指向子类的对象,也就是多态
	SingleCore* CreateSingleCore(CTYPE ctype)
	{
		//工厂内部判断
		if (ctype == COREA)
		{
			//生产核A
			return new SingleCoreA();
		}
		else if (ctype == COREB)
		{
			//生产核B
			return new SingleCoreB();
		}
		else {
			return NULL;
		}
	}
};
int main() 
{
	Factory* factor = new Factory();
	factor->CreateSingleCore(COREA)->show();

	getchar();
	return 0;
}

首先定义了一个基类SingleCore,然后以这个基类定义了两个子类SingleCoreA和SingleCoreB,接着定义了一个工厂类Factory,这个工厂类里的方法应用了多态来动态创建哪个子类。这种方法的缺陷是增加新的核类型时,必须修改工厂类Factory,这就违反了开放封闭原则。

针对简单工厂模式的缺陷,我们修改上述代码,换成工厂方法模式,如下所示:

#include<iostream>
#include<string>
using namespace std;
enum CTYPE { COREA, COREB };
//定义一个基类单核
class SingleCore
{
public:
	virtual void show() = 0;
};
//单核A
class SingleCoreA :public SingleCore
{
public:
	void show() {
		cout << "SingleCore A" << endl;
	}
};
//单核B
class SingleCoreB :public SingleCore
{
public:
	void show() {
		cout << "SingleCore B" << endl;
	}
};
//定义一个工厂的基类
class Factory {
public:
	virtual SingleCore* CreateSingleCore() = 0;
};
//生产A核的工厂
class FactoryA :public Factory
{
public:
	SingleCore* CreateSingleCore() {
		return new SingleCoreA();
	}
};
//生产B核的工厂
class FactoryB :public Factory
{
public:
	SingleCore* CreateSingleCore() {
		return new SingleCoreB();
	}
};

int main()
{
	FactoryA* a = new FactoryA();
	a->CreateSingleCore()->show();

	getchar();
	return 0;
}

工厂模式也有缺点,每增加一种产品,就需要增加一个对象的工厂。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页

打赏作者

Keras深度学习

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值