c++ 设计模式 --- 抽象工厂模式

什么是抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的。抽象工厂模式可以向 客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。

为什么使用抽象工厂模式

抽象工厂方法是针对与一个产品族,使得易于交换产品系列,只需改变具体的工厂就可以使用不同的产品配置。当一个族中的产品对象被设计成一起工作且一个应用只是用同一族的对象,例如设计系统生成不同风格的UI界面,按钮,边框等UI元素在一起使用,并且只能同属于一种风格,这很容易使用抽象工厂实现。

在淘宝中输入键盘有很多种类,例如雷蛇键盘、罗技键盘,这些种类就算作是它的产品族,产品族就是多个产品

抽象工厂模式实现步骤

1.提供一个抽象工厂类:声明一组创建一族产品的工厂方法

2.提供一个具体工厂类:实现了在抽象工厂创建产品的工厂方法

3.提供一个抽象产品类:抽象产品中声明了产品具有的业务方法

4.提供一个具体产品类:实现抽象产品接口中声明的业务方法

抽象工厂中需要提供创建大量不同产品的接口,例如创建产品 A、创建产品 B,对于产品 A 和产品 B 来说,可以由不同的工厂产生,工厂 1 产生一种品牌的 A 产品和 B 产品,工厂 2 同样也可以生产 A 产品和 B 产品

我们可以生产雷蛇键盘和罗技键盘,但是对于雷蛇键盘和罗技键盘不一定是同一家公司创建的

工厂 A 可以生产键盘(产品 A)和鼠标(产品 B),雷蛇有雷蛇工厂、罗技有罗技工厂,都可以生产键盘和鼠标

c++ 设计模式 --- 抽象工厂模式_第1张图片

抽象工厂模式实现代码

#include 
using namespace std;
//抽象产品
class Product 
{
public:
	virtual void show() = 0;
};
//抽象产品族1 生产键盘
class KeyBoard :public Product {};

//具体产品
class LogiKeyBoard :public KeyBoard 
{
	void show() 
	{
		cout << "罗技键盘......" << endl;
	}
};
class RazerKeyBoard :public KeyBoard 
{
	void show()
	{
		cout << "雷蛇键盘......" << endl;
	}
};

//抽象产品族2 除了生产键盘之外可以生产鼠标
class Mouse :public Product {};
class LogiMouse :public Mouse 
{
	void show()
	{
		cout << "罗技鼠标......" << endl;
	}
};
class RazerMouse :public Mouse
{
	void show() 
	{
		cout << "雷蛇鼠标......" << endl;
	}
};
//抽象工厂
class Factory 
{
public:
    //创建一个键盘
	virtual  KeyBoard* CreateKeyBoard() = 0;
    //创建一个鼠标
	virtual Mouse* CreateMouse() = 0;
};

//具体工厂 罗技工厂提供罗技键盘、罗技鼠标
class LogiFactory :public Factory 
{
	KeyBoard* CreateKeyBoard() 
	{
		return new LogiKeyBoard;
	}
	Mouse* CreateMouse() 
	{
		return new LogiMouse;
	}
};
//雷蛇工厂提供雷蛇键盘、雷蛇鼠标
class RazerFactory :public Factory 
{
	KeyBoard* CreateKeyBoard() 
	{
		return  new RazerKeyBoard;
	}
	Mouse* CreateMouse() 
	{
		return new RazerMouse;
	}
};

int main() 
{
    //首先需要一个工厂
	Factory* factory = new LogiFactory;
	KeyBoard* keyBoard = factory->CreateKeyBoard();
	Mouse* mouse = factory->CreateMouse();
	keyBoard->show();
	mouse->show();
    //释放后做第二次测试
	delete factory;
	delete keyBoard;
	delete mouse;
    //雷蛇工厂只生产雷蛇产品
	factory = new RazerFactory;
	keyBoard = factory->CreateKeyBoard();
	mouse = factory->CreateMouse();
	keyBoard->show();
	mouse->show();
	delete factory;
	delete keyBoard;
	delete mouse;
	factory = nullptr;
	keyBoard = nullptr;
	mouse = nullptr;
	return 0;
}

抽象工厂模式优缺点

所有产品其实是合在同一个产品下面的一个产品族,所有不同类型的鼠标都可以放在抽象的鼠标产品族下,所有不同类型的键盘都可以放在抽象的键盘产品族下,在做拓展的时候,例如需要拓展一个显示器,需要写一个显示器的类去继承一下这个抽象产品类,然后再去写不同类型的显示器并实现功能

优点

  • 抽象工厂封装了变化,封装了对象创建的具体细节

  • 增加新的产品族很方便,无须修改已有系统

  • 针对接口进行编程而不是针对具体进行编程

缺点

  • 增加新的产品等级结构需对原系统做较大修改(违背开放封闭)c++ 设计模式介绍与基本原则_小雪菜本菜的博客-CSDN博客

你可能感兴趣的:(设计模式,设计模式)