设计模式——抽象工厂(absolute factory)

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主要为了应对新的系列产生,不能应对系列对象的新需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值