必威体育Betway必威体育官网
当前位置:首页 > IT技术

设计模式之抽象工厂模式(C++)

时间:2019-10-31 20:14:36来源:IT技术作者:seo实验室小编阅读:78次「手机版」
 

抽象工厂模式

设计模式之抽象工厂模式

抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。其UML图如下:

抽象工厂模式UML图

结合上图我们来理解一下抽象工厂模式的定义。提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。在上图中一系列相互依赖或相关的对象可以理解为ProductA,ProductB,也可以有ProductC、ProductD等,这些是一系列类,要创建这一系列对象。而这一系列对象有不同的类型,比如Product1,和Product2,同样的可以是Product3等。在抽象工厂模式中创建这一系列对象是由相关的工厂负责的。比如ConcreteFactory1负责创建ProductA1、ProductB1、ProductC1等,同样的ConcreteFactory2负责创建ProductA2、ProductB2、ProductC2等。这就是定义中说的创建一系列对象的接口,而这借口就是工厂。至于无需指定它们具体的类就很明显了,因为创建相关系列的对象的时候只需用指定相关的工厂就可以了,客户端根本不需要知道具体要创建的类是什么。

举个例子吧,就拿键盘鼠标来说吧,键盘和鼠标就是一些列的类。而键盘鼠标又有微软的和联想的区别。所有有了微软的工厂和联想的工厂。键盘和鼠标具体的创建由工厂来负责,而具体创建微软的还是联想的则由客户端来指定,而客户端根本不用知道鼠标和键盘这些类。此例的示例代码如下:

// AbstractFactoryModel.h文件
#pragma once
#include <iOStream>

// 键盘
class KeyBoard
{
public:
	virtual void show() = 0;
};
// 微软的键盘
class KeyBoardMicro : public KeyBoard
{
public:
	void show()
	{
		std::cout << "微软的键盘" << std::endl;
	}
};
// 联想的键盘
class KeyBoardLenovo : public KeyBoard
{
public:
	void show()
	{
		std::cout << "联想的键盘" << std::endl;
	}
};
// 鼠标
class Mouse
{
public:
	virtual void show() = 0;
};

class MouseMicro : public Mouse
{
public:
	void show()
	{
		std::cout << "微软的鼠标" << std::endl;
	}
};

class MouseLenovo : public Mouse
{
public:
	void show()
	{
		std::cout << "联想的鼠标" << std::endl;
	}
};
// 工厂
class Factory
{
public:
	virtual KeyBoard * createKeyBoard() = 0;
	virtual Mouse * createMouse() = 0;
};
// 微软的工厂
class FactoryMicro : public Factory
{
public:
	KeyBoard * createKeyBoard()
	{
		return new KeyBoardMicro();
	}
	Mouse * createMouse()
	{
		return new MouseMicro();
	}
};
// 联想的工厂
class FactoryLenovo : public Factory
{
public:
	KeyBoard * createKeyBoard()
	{
		return new KeyBoardLenovo();
	}
	Mouse * createMouse()
	{
		return new MouseLenovo();
	}
};

测试代码如下:

#include <iostream>
#include "AbstractFactoryModel.h"

int main()
{
	using namespace std;
	// 抽象工厂模式
	Factory * p = new FactoryMicro();
	KeyBoard * pKeyBoard = p->createKeyBoard();
	Mouse * pMouse = p->createMouse();
	pKeyBoard->show();
	pMouse->show();
	delete pMouse;
	delete pKeyBoard;
	delete p;

	p = new FactoryLenovo();
	pKeyBoard = p->createKeyBoard();
	pMouse = p->createMouse();
	pKeyBoard->show();
	pMouse->show();
	delete pMouse;
	delete pKeyBoard;
	delete p;

	getchar();
	return 0;
}

测试结果如下图:

在这里插入图片描述

抽象工厂模式和工厂方法模式很相似。最大的区别就是抽象工厂模式不止一个产品簇,并且每个工厂都不止生产一种产品。比如在工厂方法模式中,不同的工厂可以生产不同的产品。比如键盘、鼠标。分别由键盘工厂和鼠标工厂,但是智能生产一种键盘和鼠标。但是在抽象工厂模式中,每个工厂可以生产键盘和鼠标。还可以生产不同牌子的键盘和鼠标。说到这里,其实抽象工厂模式可以和简单工厂模式结合起来,来创建不同的工厂。

抽象工厂模式最大的好处便是易于交换产品系列,只要改变创建的工厂对象就可以实现产品系列的更换。还有一个优点是它让具体的创建实例的过程于客户端分离,客户端是通过它们抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。最大的缺点是如果像添加产品则非常麻烦需要修改很多类。

文章最后发布于: 2018-10-26 08:11:20

相关阅读

深入浅出!全方位科普移动端导航的七种设计模式

看了很多总结导航的文章,其实都基本雷同,但是都觉得不够细致,也不是从我们常用的产品去分析的,因此用自己的思路重新分析了一遍,某些段

中国代码工厂

图片来源@Unspla

okhttp3中的设计模式

okhttp库的火热程度,相信不需要我多作说明了,网上关于该库的使用和源码分析的文章有如恒河沙数。我就不在这方面凑热闹了,本文从设计

工厂方法模式

应用场景 工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是

抽象类

https://blog.csdn.net/strive_penniless/article/details/68583857

分享到:

栏目导航

推荐阅读

热门阅读