您的位置:首页 > 其它

设计模式实现(十一)--- 抽象工厂模式(Abstract Factory)

2014-07-31 09:41 274 查看
因为客户的需求变化,在设计系统项目的时候有时候会更换数据库,如果数据库的实现单纯根据数据库单独实现,没有考虑到以后的复用的话,那么在下一个类似的系统但使用不同的数据库项目时,需要修改大量的代码才可以实现功能。

我们可以根据抽象工厂模式,将不同的数据库系统分别做成不同的类,都继承自同一个父类。那么在以后的项目中就可以利用多态的特性,调用父类工厂指针生成对应的数据库对象,来满足功能要求。

抽象工厂最大的好处是易于交换产品系列,由于具体工厂类在一个应用中只需要初始化的时候出现一次,如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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: