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

/************************************************************************/
/*                           抽象工厂模式                               */
/************************************************************************/


/*
	抽象工厂模式简介:一个工厂接口,多个产品接口
	这里我们以数据库的维护为例,假设现在有一个工程项目不一定会用到
	Access和SqlServer这两种数据库的哪一种,但是此工程中数据库的相关表已经被定下
	因为对Access和Sqlserver的操作并不相同,此时为了维护方便我们可以使用抽象工厂模式
*/



/*
	假如现在的工程中存在两个表User和Deparment
*/


#include <IOSTREAM>


using namespace std;



/*用户*/
class User
{
	
};



/*部门*/
class Department
{

};





//定义User表的抽象接口
class IUser
{
public:
	//向Iuser表中插入一个user
	virtual void Insert(User* user) = 0;

	virtual User* GetUser(int id) = 0;//根据id获取user

};



//Access中的User表(具体)
class AccessUser : public IUser
{
public:
	void Insert(User *user)
	{
		cout<<"在Access数据库中的IUser表中插入一个User(记录)"<<endl;
	}


	User* GetUser(int id)
	{
		cout<<"从Access数据库的IUser表中根据id获取一条记录"<<endl;
		return NULL;
	}

};


class SqlserverUser : public IUser
{
public:
	void Insert(User *user)
	{
		cout<<"在Sqlserver数据库中的IUser表中插入一个User(记录)"<<endl;
	}
	
	
	User* GetUser(int id)
	{
		cout<<"从Sqlserver数据库的IUser表中根据id获取一条记录"<<endl;
		return NULL;
	}
};





//定义Deparment表的抽象接口
class IDepartment
{
public:
	virtual void Insert(Department *department) = 0;
	virtual Department *GetDepartment(int id) = 0;
};




//Access 数据库中的Department表
class AccessDepartment : public IDepartment
{
public:
	void Insert(Department* department)
	{
		cout<<"在Access数据库的IDepartment表中插入一条记录"<<endl;
	}

	Department* GetDepartment(int id)
	{
		cout<<"从Access数据库的IDepartment表根据id获取一条记录"<<endl;
		return NULL;
	}
};


//Sqlserver数据库中的Department表
class SqlserverDepartment : public IDepartment
{
public:
	void Insert(Department* department)
	{
		cout<<"在Sqlserver数据库的IDepartment表中插入一条记录"<<endl;
	}
	
	Department* GetDepartment(int id)
	{
		cout<<"从Sqlserver数据库的IDepartment表根据id获取一条记录"<<endl;
		return NULL;
	}
};




//工厂接口
class IFactory
{
public:
	virtual IUser * CreateUser() = 0;

	virtual IDepartment *CreateDepartment() = 0;
};







//Access工厂类
class AccessFactory : public IFactory
{
public:
	IUser* CreateUser()
	{
		return new AccessUser();
	}

	IDepartment* CreateDepartment()
	{
		return new AccessDepartment();
	}
};


//sqlserver工厂类
class SqlserverFactory : public IFactory
{
public:
	IUser* CreateUser()
	{
		return new SqlserverUser();
	}
	
	IDepartment* CreateDepartment()
	{
		return new SqlserverDepartment();
	}
};





void main()
{
	//建立一个Access工厂
	IFactory *sqlserverFactory = new SqlserverFactory();
	IUser *user = sqlserverFactory->CreateUser();
	user->Insert(new User());
	user->GetUser(0);



	/*使用这种设计模式的好处是,
		1.当你需要更换数据库或时只需要更改一个地方
		2.当你需要对其他表进行操作时也只需要改一个地方

  可维护性大大提高
	*/



}




运行结构:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值