设计模式实现(十一)--- 抽象工厂模式(Abstract Factory)
2014-07-31 09:41
274 查看
因为客户的需求变化,在设计系统项目的时候有时候会更换数据库,如果数据库的实现单纯根据数据库单独实现,没有考虑到以后的复用的话,那么在下一个类似的系统但使用不同的数据库项目时,需要修改大量的代码才可以实现功能。
我们可以根据抽象工厂模式,将不同的数据库系统分别做成不同的类,都继承自同一个父类。那么在以后的项目中就可以利用多态的特性,调用父类工厂指针生成对应的数据库对象,来满足功能要求。
抽象工厂最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要初始化的时候出现一次,如IFactory *factory = new MySQLFactory(),着就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
第二大好处是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
抽象工厂模式的缺点是:如果要新加产品类的时候(例子中再加一个项目表),那么要修改的就又很多了,要加一个IProject,MySQLProject,OracleProject,还有IFactory,MySQLFactory,OracleFactory才可以完全实现。
这个问题其实可以用简单工厂模式来解决,通过判断来件在工厂里面判断到底生成什么类的对象,这样就可以节省很多代码了。
我们可以根据抽象工厂模式,将不同的数据库系统分别做成不同的类,都继承自同一个父类。那么在以后的项目中就可以利用多态的特性,调用父类工厂指针生成对应的数据库对象,来满足功能要求。
抽象工厂最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要初始化的时候出现一次,如IFactory *factory = new MySQLFactory(),着就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
第二大好处是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
抽象工厂模式的缺点是:如果要新加产品类的时候(例子中再加一个项目表),那么要修改的就又很多了,要加一个IProject,MySQLProject,OracleProject,还有IFactory,MySQLFactory,OracleFactory才可以完全实现。
这个问题其实可以用简单工厂模式来解决,通过判断来件在工厂里面判断到底生成什么类的对象,这样就可以节省很多代码了。
//抽象工厂模式例子 //使用不同的数据库系统 #include <string> #include <iostream> using namespace std; //用户类 class User1 { private: string name; int id; }; class Department { private: string name; int id; }; //用户抽象类 class IUser { public: virtual void Insert(User1 user) = 0; virtual void GetUser(int id) = 0; }; //不同的数据库用户类操作 class MySqlUser : public IUser { public: void Insert(User1 user) { cout << "Using MySQL insert User." << endl; } void GetUser(int id) { cout << "Using MySQL get User." << endl; } }; class OracleUser : public IUser { public: void Insert(User1 user) { cout << "Using Oracle insert User." << endl; } void GetUser(int id) { cout << "Using Oracle get User." << endl; } }; //部门抽象类 class IDepartment { private: string name; int id; public: virtual void Insert(Department depart) = 0; virtual void GetDepartment(int id) = 0; }; //不同的数据库用户类操作 class MySqlDepartment : public IDepartment { public: void Insert(Department depart) { cout << "Using MySQL insert Department." << endl; } void GetDepartment(int id) { cout << "Using MySQL get Department." << endl; } }; class OracleDepartment : public IDepartment { public: void Insert(Department depart) { cout << "Using Oracle insert Department." << endl; } void GetDepartment(int id) { cout << "Using Oracle get Department." << endl; } }; //抽象工厂类 class IFactory { public: virtual IUser &CreateUser() = 0; virtual IDepartment &CreateDepartment() = 0; }; //具体工厂类 class MySqlFactory : public IFactory { public: IUser &CreateUser() { //IUser *user = new MySqlUser(); MySqlUser *user = new MySqlUser(); return *user; } IDepartment &CreateDepartment() { //IDepartment *depart = new MySqlDepartment(); MySqlDepartment *depart = new MySqlDepartment(); return *depart; } }; class OracleFactory : public IFactory { public: IUser &CreateUser() { //IUser *user = new MySqlUser(); OracleUser *user = new OracleUser(); return user; } IDepartment &CreateDepartment() { //IDepartment *depart = new MySqlDepartment(); OracleDepartment *depart = new OracleDepartment(); return depart; } }; //客户端 int main() { User1 user; Department department; IFactory *factory = new MySqlFactory(); IUser &Iuser1 = factory->CreateUser(); Iuser1.GetUser(0); Iuser1.Insert(user); IDepartment &Idepartment1 = factory->CreateDepartment(); Idepartment1.GetDepartment(0); Idepartment1.Insert(department); delete factory; factory = new OracleFactory(); IUser &Iuser2 = factory->CreateUser(); Iuser2.GetUser(0); Iuser2.Insert(user); IDepartment &Idepartment2 = factory->CreateDepartment(); Idepartment2.GetDepartment(0); Idepartment2.Insert(department); return 1; }
相关文章推荐
- 设计模式C++实现十一:抽象工厂模式
- 常见设计模式的解析和实现(C++)之十一-TemplateMethod模式
- 设计模式之—抽象工厂模式(Abstract Factory)-Java实现
- 我所理解的设计模式(C++实现)——抽象工厂模式(Abstract Factory Pattern)
- (十一)延时执行、圆角(可实现圆形label)、代理设计模式
- [GoF设计模式]抽象工厂模式和Command模式的C++实现
- Java设计模式菜鸟系列(五)抽象工厂模式建模与实现
- GOF23设计模式之抽象工厂模式的实现
- PHP实现设计模式中的抽象工厂模式详解
- (十一)延时执行、圆角(可实现圆形label)、代理设计模式
- 设计模式实现系列-简单工厂模式-工厂模式-抽象工厂模式
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
- 设计模式之(十一、抽象工厂模式Abstract Factory)
- 设计模式之第2章-抽象工厂模式(Java实现)
- 常见设计模式的解析和实现(C++)之十一-TemplateMethod模式
- 设计模式学习之抽象工厂模式(实现数据访问层)
- 设计模式十一(桥接模式,python 语言实现)
- 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式
- 设计模式 - 抽象工厂模式(Abstract Factory) C++实现
- php实现设计模式之 抽象工厂模式