抽象工厂(abstract_factory)c++版

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

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

#include 
#include 
#include 
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数据库中增加一条数据.."<get_id() == id)
			{
				flag = true;
				return i;
			}
		}

		if(true != flag)
		{
			cout<<"没有查询到id为"< _User_data;
};

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

		if(true != flag)
		{
			cout<<"没有查询到id为"< _User_data;
};

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

		if(true != flag)
		{
			cout<<"没有查询到id为"< _Department_data;
};

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

		if(true != flag)
		{
			cout<<"没有查询到id为"< _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<<"查询到的用户是:"<get_name()<get_name()<

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

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

你可能感兴趣的:(编程,设计模式)