c++设计模式之抽象工厂模式
2012-09-30 19:08
267 查看
[cpp]
view plaincopyprint?
/************************************************************************/
/* 抽象工厂模式 */
/************************************************************************/
/*
抽象工厂模式简介:一个工厂接口,多个产品接口
这里我们以数据库的维护为例,假设现在有一个工程项目不一定会用到
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.当你需要对其他表进行操作时也只需要改一个地方
可维护性大大提高
*/
}
运行结构:
view plaincopyprint?
/************************************************************************/
/* 抽象工厂模式 */
/************************************************************************/
/*
抽象工厂模式简介:一个工厂接口,多个产品接口
这里我们以数据库的维护为例,假设现在有一个工程项目不一定会用到
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表中插入一个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.当你需要对其他表进行操作时也只需要改一个地方 可维护性大大提高 */ }
运行结构:
相关文章推荐
- 设计模式C++抽象工厂模式
- [GoF设计模式]抽象工厂模式和Command模式的C++实现
- c++设计模式之抽象工厂模式
- c++ 设计模式9 (Abstract Factory 抽象工厂模式)
- C++设计模式-AbstractFactory抽象工厂模式
- c++设计模式之简单工厂模式、工厂方法模式、抽象工厂模式
- C++设计模式——抽象工厂模式(含实例)
- 设计模式C++实现——抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 设计模式之抽象工厂模式(c++)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- C++设计模式从0进击-2-抽象工厂模式
- C++设计模式之抽象工厂模式
- C++设计模式(5):抽象工厂模式
- c++设计模式-----抽象工厂模式
- C++设计模式之抽象工厂模式(一)
- 设计模式之 抽象工厂模式的扩展(C++实现)
- c++设计模式之抽象工厂模式
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- c++ 设计模式之 抽象工厂模式