美文网首页
对象创建模式

对象创建模式

作者: timber_wu | 来源:发表于2016-10-03 20:04 被阅读40次

通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖工具类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。

典型模式

  • Factory Method
  • Abstract Factory
  • Prototype
  • Builder

Factory Method 工厂方法

动机

  • 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化.
  • 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
  • 关键方法返回一个对象
    非静态方法 工厂基类

模式定义

  • 定义一个创建对象的接口,让子类决定实例化哪一个类.Factory Method 使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类.

要点总结

  • Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
  • Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系
  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同

Abstract Factory抽象工厂

定义

产品族:位于不同产品等级结构,功能相关联的产品组成的家族。
如图:


产品族

图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。

所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用图来描述的话,如下图:

结构


图中描述的东西用产品族描述如下


举例

    //数据库访问有关的基类
    class IDBConnection{
    
    }
    
    class IDBCommand{
    
    }
    
    class IDataReader{
    
    }
    
    
    abstract class IDBFactory{
        public abstract IDBConnection createDBConnection();
        public abstract IDBCommand createDBCommand();
        public abstract IDataReader createDataReader();
        
    
    }
    
    //支持My SQL
    class MySqlConnection extends IDBConnection{
    
    }
    class MySqlCommand extends IDBCommand{
    
     }
    class MySqlDataReader extends IDataReader{
    
    }
    
    
    class MySqlDBFactory extends IDBFactory{
    
        @Override
        public IDBConnection createDBConnection() {
            return new MySqlConnection();
        }

        @Override
        public IDBCommand createDBCommand() {
            return new MySqlCommand();
        }
    
        @Override
        public IDataReader createDataReader() {
            return new MySqlDataReader();
        }
    
    
     }
    
    //支持Oracle
    class OracleConnection extends IDBConnection{
    
    }
    
    class OracleCommand extends IDBCommand{
    
    }
    
    class OracleDataReader extends IDataReader{
    
    }

    class OracleDBFactory extends IDBFactory{
    
        @Override
        public IDBConnection createDBConnection() {
            return new OracleConnection();
        }

        @Override
        public IDBCommand createDBCommand() {
            return new OracleCommand();
        }
    
        @Override
public IDataReader createDataReader() {
            return new OracleDataReader();
        }
    }
    
    
    class EmployeeDAO{
        IDBFactory dbFactory;
        public Vector<EmployeeDO> getEmployees(){
            IDBConnection connection =dbConnectionFactory.createDBConnection();
            connection.setConnectionString("...");

            IDBCommand command = dbCommandFactory.createDBCommand();
            command.setCommandText("...");
            command.setConnection(connection);//关联性
    
            IDBDataReader reader = command.executeReader();//关联性
            while (reader.read()) {
    
    
            }
    
            return employeeDOs;
        }
    
            
    }

在什么情形下使用抽象工厂模式:

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
  • 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
  • 同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

相关文章

  • (GeekBand)C++设计模式 第二周学习笔记

    Factory Method模式 “对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中...

  • 2018-03-22

    Boolan C++设计模式二 “对象创建”模式:通过“对象创建”模式绕开new,来避免对象创建(new)过程中所...

  • js创建对象及工厂模式

    单体创建对象 工厂模式创建对象

  • 单体创建对象、工厂模式创建对象

    单体创建对象 工厂模式创建对象

  • JavaScript对象的创建方法

    大纲 前言1、简单方式创建对象的方法2、工厂模式创建对象3、构造函数模式创建对象4、原型模式创建对象5、组合使用构...

  • javascript面向对象与原型

    昨天我们讲了在面向对象中创建对象的几种方式 工厂模式 构造函数模式 工厂模式创建的对象,像工厂一样来创建对象,创建...

  • 模式设计之 原型模式

    定义 原型模式:原型模式用于创建重复的对象,实现对象的拷贝。这种模式类似于创建型模式,提供了创建对象的最佳模式。 ...

  • 设计模式(Design pattern)

    一、分类 1、根据目的分类 创建型模式、结构型模式和行为型模式 创建型模式:“怎样创建对象” -> “对象的创建与...

  • 第二周(Geek Band)

    ---------------------对象创建-------------------- 通过【对象创建模式】绕...

  • 设计模式分为三种类型,共23类

    1.创建型模式 创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能...

网友评论

      本文标题:对象创建模式

      本文链接:https://www.haomeiwen.com/subject/pubkyttx.html