大话设计模式抽象工厂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