前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >大话设计模式07-抽象工厂模式-2020-9-22

大话设计模式07-抽象工厂模式-2020-9-22

作者头像
用户7719114
发布2022-02-22 13:23:45
1610
发布2022-02-22 13:23:45
举报
文章被收录于专栏:C++小白C++小白

1.抽象工厂模式简介

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

在这里插入图片描述
在这里插入图片描述

抽象工厂类对应有多个系列的产品,每个系列都有一个抽象产品父类和多个具体产品子类。定义了一个父类工厂,并且对每一个系列产品都有对个具体的子类工厂,子类工厂中定义了该系列产品的具体创建方法。

2.实例

定义了两类数据库的操作类,包括sql和access。UML类图如下所示

在这里插入图片描述
在这里插入图片描述

c++代码实现如下

代码语言:javascript
复制
#include<exception>
#include <iostream>
#include<string>
using namespace std;
//7、抽象工厂模式:数据库类
class User
{
public:
	User(string istrName, string iId):m_strName(istrName),m_id(iId){}
	string getName(){ return m_strName; }
	string getID(){ return m_id; }
private:
	string m_strName;
	string m_id;
};

class Department
{
public:
	Department(string istrName, string iId) :m_strName(istrName), m_id(iId){}
	string getName(){ return m_strName; }
	string getID(){ return m_id; }
private:
	string m_strName;
	string m_id;
};

class DataUser
{
public:
	virtual ~DataUser(){};
	virtual void addUser(User *ipUser) = 0;
	virtual void delUser(User *ipUser) = 0;
};

class SqlServerUser:public DataUser
{
public:
	void addUser(User *ipUser) override
	{
		cout << "add sql user "<<ipUser->getName()<<":" <<ipUser->getID()<< endl;
	}
	void delUser(User *ipUser) override
	{
		cout << "del sql user " << ipUser->getName() << ":" << ipUser->getID() << endl;
	}
};

class AccessUser :public DataUser
{
public:
	void addUser(User *ipUser) override
	{
		cout << "add access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
	}
	void delUser(User *ipUser) override
	{
		cout << "del access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
	}
};

class AccessUser :public DataUser
{
public:
	void addUser(User *ipUser) override
	{
		cout << "add access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
	}
	void delUser(User *ipUser) override
	{
		cout << "del access user " << ipUser->getName() << ":" << ipUser->getID() << endl;
	}
};

class DataDepartment
{
public:
	virtual ~DataDepartment(){};
	virtual void addDepartment(Department *ipDepartment) = 0;
	virtual void delDepartment(Department *ipDepartment) = 0;
};

class SqlServerDepartment :public DataDepartment
{
public:
	void addDepartment(Department *ipDepartment) override
	{
		cout << "add sql department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
	}
	void delDepartment(Department *ipDepartment) override
	{
		cout << "del sql department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
	}
};

class AccessDepartment :public DataDepartment
{
public:
	void addDepartment(Department *ipDepartment) override
	{
		cout << "add access department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
	}
	void delDepartment(Department *ipDepartment) override
	{
		cout << "del access department " << ipDepartment->getName() << ":" << ipDepartment->getID() << endl;
	}
};

class DataFactory
{
public:
	virtual ~DataFactory(){};
	virtual DataUser *createUser() = 0;
	virtual DataDepartment *createDepartment() = 0;
};

class SqlServerFactory :public DataFactory
{
public:
	DataUser *createUser()
	{
		return new SqlServerUser;
	}
	DataDepartment *createDepartment()
	{
		return new SqlServerDepartment;
	}
};

class AccessFactory :public DataFactory
{
public:
	DataUser *createUser()
	{
		return new AccessUser;
	}
	DataDepartment *createDepartment()
	{
		return new AccessDepartment;
	}
};

int main()
{
	User *pUser = new User("wyl","1234");
	Department *pDepartment = new Department("hust","4567");
	SqlServerFactory *pFact = new SqlServerFactory;
	DataUser *pServerUser = pFact->createUser();
	pServerUser->addUser(pUser);
	DataDepartment *pDataDepartment = pFact->createDepartment();
	pDataDepartment->addDepartment(pDepartment);
	delete pDataDepartment;
	delete pServerUser;
	delete pFact;
	delete pDepartment;
	delete pUser;
	system("pause");
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.抽象工厂模式简介
  • 2.实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档