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

1.抽象工厂模式简介

抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体实现的类。UML类图如下:
在这里插入图片描述
抽象工厂类对应有多个系列的产品,每个系列都有一个抽象产品父类和多个具体产品子类。定义了一个父类工厂,并且对每一个系列产品都有对个具体的子类工厂,子类工厂中定义了该系列产品的具体创建方法。


2.实例

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


在这里插入图片描述
c++代码实现如下

#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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值