“对象创建”模式——抽象工厂

动机

在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作,同时由于需求的变化,往往存在更多系列对象的创建对象

如何应对这种变化,如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种”多系列具体对象创建工作“的紧耦合

模式定义

提供一个接口,让该接口负责创建一系列”相关或者相互依赖的对象“无需指定他们具体的类

问题代码
//数据库访问有关的基类
class IDBConnection{
    
};
class IDBConnectionFactory{
public:
    virtual IDBConnection* CreateDBConnection()=0;
};


class IDBCommand{
    
};
class IDBCommandFactory{
public:
    virtual IDBCommand* CreateDBCommand()=0;
};


class IDataReader{
    
};
class IDataReaderFactory{
public:
    virtual IDataReader* CreateDataReader()=0;
};


//支持SQL Server
class SqlConnection: public IDBConnection{
    
};
class SqlConnectionFactory:public IDBConnectionFactory{
    
};


class SqlCommand: public IDBCommand{
    
};
class SqlCommandFactory:public IDBCommandFactory{
    
};


class SqlDataReader: public IDataReader{
    
};
class SqlDataReaderFactory:public IDataReaderFactory{
    
};

//支持Oracle
class OracleConnection: public IDBConnection{
    
};

class OracleCommand: public IDBCommand{
    
};

class OracleDataReader: public IDataReader{
    
};



class EmployeeDAO{
    IDBConnectionFactory* dbConnectionFactory;
    IDBCommandFactory* dbCommandFactory;
    IDataReaderFactory* dataReaderFactory;
    
    
public:
    vector<EmployeeDO> GetEmployees(){
        IDBConnection* connection =
            dbConnectionFactory->CreateDBConnection();
        connection->ConnectionString("...");

        IDBCommand* command =
            dbCommandFactory->CreateDBCommand();
        command->CommandText("...");
        command->SetConnection(connection); //关联性

        IDBDataReader* reader = command->ExecuteReader(); //关联性
        while (reader->Read()){

        }

    }
};

:他和普通工厂的区别就是,如果你创建的对象之间有关联性,你使用躲过工厂进行创建的时候,编译器就会报错,所以我们可以将他们放在一个工厂里面,从而达到关联性的目的

//数据库访问有关的基类
class IDBConnection{
    
};

class IDBCommand{
    
};

class IDataReader{
    
};


class IDBFactory{
public:
    virtual IDBConnection* CreateDBConnection()=0;
    virtual IDBCommand* CreateDBCommand()=0;
    virtual IDataReader* CreateDataReader()=0;
    
};


//支持SQL Server
class SqlConnection: public IDBConnection{
    
};
class SqlCommand: public IDBCommand{
    
};
class SqlDataReader: public IDataReader{
    
};


class SqlDBFactory:public IDBFactory{
public:
    virtual IDBConnection* CreateDBConnection()=0;
    virtual IDBCommand* CreateDBCommand()=0;
    virtual IDataReader* CreateDataReader()=0;
 
};

//支持Oracle
class OracleConnection: public IDBConnection{
    
};

class OracleCommand: public IDBCommand{
    
};

class OracleDataReader: public IDataReader{
    
};



class EmployeeDAO{
    IDBFactory* dbFactory;
    
public:
    vector<EmployeeDO> GetEmployees(){
        IDBConnection* connection =
            dbFactory->CreateDBConnection();
        connection->ConnectionString("...");

        IDBCommand* command =
            dbFactory->CreateDBCommand();
        command->CommandText("...");
        command->SetConnection(connection); //关联性

        IDBDataReader* reader = command->ExecuteReader(); //关联性
        while (reader->Read()){

        }

    }
};

结构

在这里插入图片描述

要点总结
  1. 如果没有应对“多系列对象构建”的需求变化,则没有必要使用
    Abstract Factory模式,这时候使用简单的工厂完全可以。
  2. 系列对象”指的是在某一特定系列下的对象之间有相互依赖、
    或作用的关系。不同系列的对象之间不能相互依赖。
  3. Abstract Factory模式主要在于应对“新系列”的需求变动。其缺
    点在于难以应对“新对象”的需求变动。
房屋销售查询系统是一个典型的应用场景,其中可以应用抽象工厂模式来设计系统的架构。抽象工厂模式是一种创建设计模式,它提供了一种方式来封装一组具有相同主题的单个工厂,而无需指定它们的具体类。下面是一个简单的介绍和示例: ### 抽象工厂模式简介 抽象工厂模式通过提供一个接口来创建一系列相关或相互依赖的对象,而无需指定它们的具体类。客户端通过抽象接口来创建对象,而不需要知道具体的实现类。这种方式提高了系统的灵活性和可扩展性。 ### 房屋销售查询系统的应用 在房屋销售查询系统中,我们可以使用抽象工厂模式创建不同类型的房屋查询服务,例如:普通房屋查询服务、高档房屋查询服务等。系统的架构可以分为以下几个部分: 1. **抽象产品**:定义不同类型的房屋查询服务的接口。 2. **具体产品**:实现抽象产品接口的具体类。 3. **抽象工厂**:定义创建抽象产品的接口。 4. **具体工厂**:实现抽象工厂接口的具体类。 ### 示例代码 ```java // 抽象产品 interface HouseQueryService { void queryHouses(); } // 具体产品1 class NormalHouseQueryService implements HouseQueryService { @Override public void queryHouses() { System.out.println("查询普通房屋信息"); } } // 具体产品2 class LuxuryHouseQueryService implements HouseQueryService { @Override public void queryHouses() { System.out.println("查询高档房屋信息"); } } // 抽象工厂 interface HouseQueryFactory { HouseQueryService createHouseQueryService(); } // 具体工厂1 class NormalHouseQueryFactory implements HouseQueryFactory { @Override public HouseQueryService createHouseQueryService() { return new NormalHouseQueryService(); } } // 具体工厂2 class LuxuryHouseQueryFactory implements HouseQueryFactory { @Override public HouseQueryService createHouseQueryService() { return new LuxuryHouseQueryService(); } } // 客户端代码 public class HouseSalesQuerySystem { public static void main(String[] args) { HouseQueryFactory factory = new NormalHouseQueryFactory(); HouseQueryService service = factory.createHouseQueryService(); service.queryHouses(); factory = new LuxuryHouseQueryFactory(); service = factory.createHouseQueryService(); service.queryHouses(); } } ``` ### 解释 1. **抽象产品** `HouseQueryService` 定义了查询房屋的接口。 2. **具体产品** `NormalHouseQueryService` 和 `LuxuryHouseQueryService` 实现了 `HouseQueryService` 接口,分别用于查询普通房屋和高档房屋。 3. **抽象工厂** `HouseQueryFactory` 定义了创建 `HouseQueryService` 的接口。 4. **具体工厂** `NormalHouseQueryFactory` 和 `LuxuryHouseQueryFactory` 实现了 `HouseQueryFactory` 接口,分别用于创建不同类型的房屋查询服务。 5. **客户端代码** 通过具体工厂创建具体的房屋查询服务,并调用其查询方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值