动机
在软件系统中,经常面临着”一系列相互依赖的对象“的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作
如果应对这种变换?如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”多系列具体对象创建工作“的紧耦合?
实例
数据库连接的时候会有很多关联的对象,这些对象是一个整体
朴素
class EmployeeDAO{
public:
vector<EmployeeDAO> GetEmployees(){
SqlConnection &connection = new SqlConnection();
connection->ConnectionString = "...";
SqlCommand *command = new SqlCommand();
command->CommandText = "...";
SqlDataReader* reader = command = command->ExecuteReader();
while(reader->Read()){
}
}
}
抽象工厂 Abstract Factory
//数据库访问有关的基类
class IDBConnection{
};
class IDBommand{
};
class IDataReader{
}
class IDBFactory{
public :
virtual IDBConnection *CreateDBConnection() = 0;
virtual IDBommand *CreateDBCommand() = 0;
virtual IDataReader *CreateDataReader() = 0;
}
//支持SQL Server
class SqlConnection : public IDBConnection{
}
class SqlCommand : public IDBCommand{
}
class SqlDataReader : public IDataReader{
}
//sql工厂
class SqlFactory: public IDBFactory{
virtual IDBConnection *CreateDBConnection()...;
virtual IDBommand *CreateDBCommand()...;
virtual IDataReader *CreateDataReader()...;
}
//支持Oracle
class OracleConnection : public IDBConnection{
}
class OracleCommand : public IDBCommand{
}
class OracleDataReader : public IDataReader{
}
//Oracle工厂
class SqlFactory: public IDBFactory{
virtual IDBConnection *CreateDBConnection()...;
virtual IDBommand *CreateDBCommand()...;
virtual IDataReader *CreateDataReader()...;
}
class EmployeeDAO{
private:
IDBFactory * factory;
public:
vector<EmployeeDAO> GetEmployees(){
IDBConnection &connection = new CreateDBConnection();
factory->ConnectionString = "...";
factory *command = new CreateDBCommand();
command->CommandText = "...";
command->SetConnection(connection); //关联性
IDataReader* reader = command->ExecuteReader();//关联性
while(reader->Read()){
}
}
}
模式定义
提供一个接口,让该接口负责创建一系列”相关或者相互依赖的独享“,无需指定他们具体的类。
结构
要点总结
- 如果没有应对”多系列对象构建“的需求变换,则没有必要使用Abstract Factory模式 这时候使用简单的工厂完全可以、
- ”系列对象“指的是在某一特定系列下的对象之间有相互依赖或作用的关系。不同系列的对象之间不能相互依赖
- Abstract Factory 模式主要在于应对”新系列“的需求变动。其缺点在于难以应对”新对象“的需求变动
笔记
- 抽象工厂就是在工厂模式的基础上创建多个对象
- 抽象工厂就是创建很多个对象 对象之间是一组一组的关系 不能这个对象用这个组里的 那个对象又用另外一个组里的
- 设计模式是解决稳定中有变换 既有稳定也有不稳定