Factory Method,Abstract Factory,Prototype,Builder属于对象创建模式。
motivation:可能面对一系列相互依赖的对象时;可能面对更多系列对象的创建工作。
key interface or class:
1. IFactory基类接口。
feature: 多个factory method放在一个抽象工厂接口中。
structure:
template codes:
使用factory method
//三种product接口,三种对应的factory接口
//1
class IDbConnection{
public:
//接口虚方法
};
class IDbConnectionFactory{
public:
virtual IDbConnection* createDbConnection()=0;
};
//2
class IDbCommand{
public:
//接口虚方法
};
class IDbCommandFactory{
public:
virtual IDbCommand* createDbCommand()=0;
};
//3
class IDbDataReader{
public:
//接口虚方法
};
class IDbDataReaderFactory{
public:
virtual IDbDataReader* createDbDataReader()=0;
};
//创建不同DB的factory和product
//例如:SQL的三组对象
//1
class SqlDbConnection: public IDbConnection{
public:
//实现具体的接口虚方法
};
class SqlDbConnectionFactory: public IDbConnectionFactory{
public:
virtual IDbConnection* createDbConnection(){
return new SqlDbConnection();
}
};
//2
class SqlDbCommand: public IDbCommand{
public:
//实现具体的接口虚方法
};
class SqlDbCommandFactory: public IDbCommandFactory{
public:
virtual IDbCommand* createDbCommand(){
return new SqlDbCommand();
}
};
//3
class SqlDbDataReader: public IDbDataReader{
public:
//实现具体的接口虚方法
};
class SqlDbDataReaderFactory: public IDbDataReaderFactory{
public:
virtual IDbDataReader* createDbDataReader(){
return new SqlDbDataReader();
}
};
//调用
class EmployeeDAO{
IDbConnectionFactory* connectionFactory;
IDbCommandFactory* commandFactory;
IDbDataReaderFactory* dataReaderFactory;
void Proess(){
IDbConnection* connection = connectionFactory->createDbConnection();
connection->ConnectionToString("...");
IDbCommand* command = commandFactory->createDbCommand();
command->CommandText("...");
command->SetConnection(connection); //product之间关联
IDbDataReader* reader = dataReaderFactory->createDbDataReader();
while(reader->ReaderExcute(command)){ //product之间关联
//...
}
};
使用抽象工厂
class IDbFactory{
virtual IDbConnection* createDbConnection()=0;
virtual IDbCommand* createDbCommand()=0;
virtual IDbDataReader* createDbDataReader()=0;
};
//sql的factory实现
class SqlDbFactory: public IDbFactory{
virtual IDbConnection* createDbConnection(){
return new SqlDbConnection();
}
virtual IDbCommand* createDbCommand(){
return new SqlDbCommand();
}
virtual IDbDataReader* createDbDataReader(){
return new SqlDbDataReader();
}
};
//调用
class EmployeeDAO{
IDbFactory* dbFactory;
void Proess(){
IDbConnection* connection = dbFactory->createDbConnection();//使用同一个工厂创建
connection->ConnectionToString("...");
IDbCommand* command = dbFactory->createDbCommand();//使用同一个工厂创建
command->CommandText("...");
command->SetConnection(connection);
IDbDataReader* reader = dbFactory->createDbDataReader();//使用同一个工厂创建
while(reader->ReaderExcute(command)){
//...
}
};
summary:
1. 如果没有以一系列的对象创建,则只有使用factory method就可实现目的;
2.“系列对象”指的是在某些条件下,相互依赖后者产生作用的对象;
3.abstract factory主要为了应对新的系列产生,不能应对系列对象的新需求。