设计模式 C++抽象工厂模式

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 C++抽象工厂模式相关的知识,希望对你有一定的参考价值。

抽象工厂模式

抽象工厂模式是工厂方法模式的泛化版,工厂方法模式是一种特殊的抽象工厂模式。在工厂方法模式中,每一个具体工厂只能生成一种具体产品,而在抽象工厂方法模式中,每一个具体工厂可以生成多个具体产品。在实际的软件开发中,抽象工厂模式使用频率较高

我们先来搞懂产品族和产品等级结构
在这里插入图片描述
产品族就相等于一个工厂所产生的产品;产品等级结构则是不同的产品;例如华为的手机,路由器,电脑就是一个产品族;而手机,路由器,电脑就形成三个产品等级结构,各有各的产品等级结构

抽象工厂模式包含4个角色

AbstractFactory(抽象工厂):抽象工厂用于声明生成抽象产品的函数,在一个抽象工厂中可以定义一组函数,每一个函数对应一个产品等级结构
ConcreateFactory(具体工厂):具体工厂重写抽象工厂声明的生成抽象产品的函数,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中
AbstractProduct(抽象产品):在抽象产品中定义产品的抽象业务函数
ConcreateProduct(具体产品):具体产品定义具体工厂生成的具体产品对象,重写抽象产品接口中定义的业务函数

抽象工厂模式结构图

在这里插入图片描述
我们用华为和苹果来举例并写出代码
1、抽象产品

//抽象产生--手机
class Phone
{
public:
	//抽象业务函数--听音乐
	virtual void listenMusic() = 0;
};
//抽象产品--电脑
class Computer
{
public:
	//抽象业务函数--打游戏
	virtual void playGame() = 0;
};

2、抽象工厂

//抽象工厂
class Factory
{
public:
	//生产抽象产品--生产手机
	virtual Phone* createPhone() = 0;
	//生产抽象产品--生产电脑
	virtual Computer* createComputer() = 0;
};

3、具体产品

//具体产品--华为手机
class HuaweiPhone : public Phone
{
public:
	//重写抽象产品中的业务函数
	virtual void listenMusic()
	{
		cout << "拿着华为手机听音乐" << endl;
	}
};
//具体产品--华为电脑
class HuaweiComputer : public Computer
{	
public:
	//重写抽象产品中的业务函数
	virtual void playGame()
	{
		cout << "拿着华为电脑打游戏" << endl;
	}
};
//具体产品--苹果手机
class ApplePhone : public Phone
{
public:
	//重写抽象产品中的业务函数
	virtual void listenMusic()
	{
		cout << "拿着苹果手机听音乐" << endl;
	}
};
//具体产品--苹果电脑
class AppleComputer : public Computer
{
public:
	//重写抽象产品中的业务函数
	virtual void playGame()
	{
		cout << "拿着华为电脑打游戏" << endl;
	}
};

4、具体工厂

//具体工厂--华为工厂
class HuaweiFactory : public Factory
{
public:
	//重写抽象工厂中的生产手机
	virtual Phone* createPhone()
	{
		return new HuaweiPhone();
	}
	//重写抽象工厂中的生产电脑
	virtual Computer* createComputer()
	{
		return new HuaweiComputer();
	}
};
//具体工厂--苹果工厂
class AppleFactory : public Factory
{
public:
	//重写抽象工厂中的生产手机
	virtual Phone* createPhone()
	{
		return new ApplePhone();
	}
	//重写抽象工厂中的生产电脑
	virtual Computer* createComputer()
	{
		return new AppleComputer();
	}
};

测试代码

int main()
{
	//创建华为工厂
	Factory* huaweiFactory = new HuaweiFactory();
	//华为工厂生产手机
	Phone* huaweiPhone = huaweiFactory->createPhone();
	//华为的手机听音乐
	huaweiPhone->listenMusic();
	//华为工厂生产电脑
	Computer* huaweiComputer = huaweiFactory->createComputer();
	//华为的电脑打游戏
	huaweiComputer->playGame();

	//创建苹果工厂
	Factory* appleFactory = new AppleFactory();
	//苹果工厂生产手机
	Phone* applePhone = appleFactory->createPhone();
	//苹果的手机听音乐
	applePhone->listenMusic();
	//苹果工厂生产电脑
	Computer* appleComputer = appleFactory->createComputer();
	//苹果的电脑打游戏
	appleComputer->playGame();
	return 0;
}

运行结果:
在这里插入图片描述
总结
抽象工厂模式的优点:
1、抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都重写了抽象工厂中定义的函数,因此只需要改变具体工厂的实例,就可以在这种某种程度上改变整个软件系统的行为。另外应用抽象工厂模式可以实现高内聚,低耦合的设计目的,因此抽象工厂模式得到了广泛的应用
2、当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”

抽象工厂模式的缺点:
在添加新的产品对象时,难以扩展抽象工厂来产生新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该抽象类进行扩展,而这将涉及对抽象工厂角色及其所有子类的修改,显然会带来较大的不便

以上是关于设计模式 C++抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 C++抽象工厂模式

设计模式 C++抽象工厂模式

C++设计模式:抽象工厂模式

C++设计模式:抽象工厂模式

C++设计模式:抽象工厂模式

C++设计模式:抽象工厂模式