c++设计模式之抽象工厂模式
来源:互联网 发布:同步带选型计算软件 编辑:程序博客网 时间:2024/05/22 13:46
- /************************************************************************/
- /* 抽象工厂模式 */
- /************************************************************************/
- /*
- 抽象工厂模式简介:一个工厂接口,多个产品接口
- 这里我们以数据库的维护为例,假设现在有一个工程项目不一定会用到
- 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.当你需要对其他表进行操作时也只需要改一个地方
- 可维护性大大提高
- */
- }
/************************************************************************//* 抽象工厂模式 *//************************************************************************//*抽象工厂模式简介:一个工厂接口,多个产品接口这里我们以数据库的维护为例,假设现在有一个工程项目不一定会用到Access和SqlServer这两种数据库的哪一种,但是此工程中数据库的相关表已经被定下因为对Access和Sqlserver的操作并不相同,此时为了维护方便我们可以使用抽象工厂模式*//*假如现在的工程中存在两个表User和Deparment*/#include <IOSTREAM>using namespace std;/*用户*/class User{};/*部门*/class Department{};//定义User表的抽象接口class IUser{public://向Iuser表中插入一个uservirtual 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.当你需要对其他表进行操作时也只需要改一个地方 可维护性大大提高*/}
运行结构:
- 设计模式之抽象工厂模式(c++)
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之-抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- 设计模式之抽象工厂
- c++设计模式之组合模式
- c++设计模式之适配器模式
- 写给常熬夜的程序员朋友
- c++设计模式之状态模式
- 模板方法模式
- c++设计模式之抽象工厂模式
- c++设计模式之装饰者模式
- c++设计模式之原型模式Prototype
- symbolicatecrash 在什么位置
- 1到n中减少了一个数,顺序被打乱,找出缺失的数
- linux内核定时器
- xcode4.4符号化脚本
- jQuery代码分析之二Selector Engine
- 关于MAX232一点心得