抽象工厂(abstract_factory)c++版

大话设计模式抽象工厂abstract_factory模式的c++版本

/*
 * abstract_factory.cpp
 *
 *  Created on: Aug 5, 2017
 *      Author: clh01s@163.com
 *      抽象工厂模式
 *      提供一个创建一系列相关或相互依赖对象的接口,
 *      而无需指定它们具体的类.
 *      以数据库操作为例子
 */

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class User
{
public:
	int get_id(){return _id;}
	void set_id(int id){_id = id;}
	string get_name(){return _name;}
	void set_name(string name){_name = name;}
private:
	int _id;
	string _name;
};

class Department
{
public:
	int get_id(){return _id;}
	void set_id(int id){_id = id;}
	string get_name(){return _name;}
	void set_name(string name){_name = name;}
private:
	int _id;
	string _name;
};

//抽象接口,用于客户端访问,解除与具体数据库访问的耦合
class IUser
{
public:
	virtual ~IUser(){}
	virtual void Insert(User *user){};
	virtual User* GetUser(int id){return NULL;}
};

class IDepartment
{
public:
	virtual ~IDepartment(){}
	virtual void Insert(Department *department){};
	virtual Department* GetDepartment(int id){return NULL;}
};

//用于访问sql数据库
class SqlserverUser:public IUser
{
public:
	void Insert(User *user) override
	{
		cout<<"在sql数据库中增加一条数据.."<<endl;
		_User_data.push_back(user);
	}

	User* GetUser(int id) override
	{
		cout<<"在sql数据库中获取数据.."<<endl;
		bool flag = false;

		for(auto i:_User_data)
		{
			if(i->get_id() == id)
			{
				flag = true;
				return i;
			}
		}

		if(true != flag)
		{
			cout<<"没有查询到id为"<<id<<"的数据"<<endl;
			return NULL;
		}
	}
private:
	//保存数据模拟数据库
	vector<User*> _User_data;
};

//用于访问Access数据库
class AccessUser: public IUser
{
public:
	void Insert(User *user) override
	{
		cout<<"在Access数据库中增加一条数据.."<<endl;
	}

	User* GetUser(int id) override
	{
		cout<<"在Access数据库中获取数据.."<<endl;
		bool flag = false;
		for(auto i:_User_data)
		{
			if(i->get_id() == id)
			{
				flag = true;
				return i;
			}
		}

		if(true != flag)
		{
			cout<<"没有查询到id为"<<id<<"的数据"<<endl;
			return NULL;
		}
	}
private:
	//保存数据模拟数据库
	vector<User*> _User_data;
};

//用于访问sql数据库获取部门信息
class SqlserverDepartment:public IDepartment
{
public:
	void Insert(Department *department) override
	{
		cout<<"在sql数据库中增加一条数据.."<<endl;
		_Department_data.push_back(department);
	}

	Department* GetDepartment(int id) override
	{
		cout<<"在sql数据库中获取数据.."<<endl;
		bool flag = false;

		for(auto i:_Department_data)
		{
			if(i->get_id() == id)
			{
				flag = true;
				return i;
			}
		}

		if(true != flag)
		{
			cout<<"没有查询到id为"<<id<<"的数据"<<endl;
			return NULL;
		}
	}
private:
	//保存数据模拟数据库
	vector<Department*> _Department_data;
};

//用于访问Access数据库获取部门信息
class AccessDepartment: public IDepartment
{
public:
	void Insert(Department *user) override
	{
		cout<<"在Access数据库中增加一条数据.."<<endl;
	}

	Department* GetDepartment(int id) override
	{
		cout<<"在Access数据库中获取数据.."<<endl;
		bool flag = false;
		for(auto i:_Department_data)
		{
			if(i->get_id() == id)
			{
				flag = true;
				return i;
			}
		}

		if(true != flag)
		{
			cout<<"没有查询到id为"<<id<<"的数据"<<endl;
			return NULL;
		}
	}
private:
	//保存数据模拟数据库
	vector<Department*> _Department_data;
};

//抽象接口类,定义一个创建访问User表对象的抽象的工厂接口
class IFactory
{
public:
	virtual ~IFactory(){}
	virtual IUser* CreateUser() = 0;
	virtual IDepartment* CreateDepartment() = 0;
};

//下面两个类都实现了IFactory接口,分别给sql和access使用
class SqlServerFactory:public IFactory
{
public:
	IUser* CreateUser() override
	{
		return new SqlserverUser();
	}

	IDepartment* CreateDepartment() override
	{
		return new SqlserverDepartment();
	}
};

class AccessFactory:public IFactory
{
public:
	IUser* CreateUser() override
	{
		return new AccessUser();
	}

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

int main()
{
	User *user = new User();
	//设置用户信息
	user->set_id(31);
	user->set_name("小黄");

	Department *department = new Department();

	department->set_id(2);
	department->set_name("研发部");

	//要改变数据库只需要改变new的实例即可
	IFactory *factory = new SqlServerFactory();

	//调用相应的工厂函数
	IUser *iu = factory->CreateUser();
	IDepartment *id = factory->CreateDepartment();
	//插入数据
	iu->Insert(user);
	id->Insert(department);
	//获取数据
	User *a = iu->GetUser(31);
	Department *b = id->GetDepartment(2);
	if(NULL != a)
	{
		cout<<"查询到的用户是:"<<a->get_name()<<endl;
	}

	if(NULL != b)
	{
		cout<<"查询到的部门是:"<<b->get_name()<<endl;
	}

	return 0;
}

在以下情况可以是用abstract factory模式(摘抄自《设计模式》):
1.一个系统要独立于他的产品的创建.组合和表示时
2.一个系统要由多个产品系列中的一个来配置时.
3.当我们强调一系列相关的产品对象的设计以便进行联合使用时.
4.当你提供一个产品类库,而只想显示它们的接口而不是实现时.

abstract factory 模式的优点(摘抄自《设计模式》):
1.它分离了具体的类 因为一个工厂封装创建茶农对象的责任和过程,它将客户与类的实现分离.
2.它使得易于交换产品系列 一个具体工厂类在一个应用中仅出现一次即在它初始化的时候.这使得改变一个应用的具体工厂变得很容易.
3.它有利于产品的一致性 当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要.abstract factory很容易实现这一点.
缺点:
难以支持新种类的产品 难以扩展抽象工厂以生产新种类的产品.这是因为abstract factory接口确定了可以被创建的产品集合.支持新种类的产品就需要扩展该工厂的接口这将涉及abstract factory类及所有子类的改变.
转载请注明出处:http://blog.csdn.net/clh01s

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值