设计模式——创建型模式

一、什么是创建型模式

创建型模式涉及对象的实例化,这类模式的特点是,不让用户代码依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象。

二、GOF的23种模式中的五种创建型模式

1、工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method使一个类的实例化延迟到其子类。

2、抽象工厂模式:提供一个创建一系列或互相依赖对象的接口,而无需指定它们具体的类。

3、生成器模式:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。

4、原型模式:用原型实例指定创建对象的种类,并且通过复制这些原创创建新的对象

5、单件模式(单例模式):保证一个类仅有一个实例,并提供一个全局访问点。

三、具体模式

1、工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method使一个类的实例化延迟到其子类。得到一个类的子类的实力最常用的办法就是使用new运算符和盖子类的构造方法,但是在某些情况下,用户可能不应该或无法使用这种办法来得到一个子类的实力,其原因是系统不予许用户代码和该类的子类形成耦合或者用户不知道该类有哪些子类可用。

(1)设计模式的结构

工厂方法模式的结构中的四种角色:

抽象产品(Product0):抽象类或接口,负责定义具体产品必须实现的方法。

具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现这个接口的类。

构造者(Creator):一个接口或抽象类。构造者负责定义一个称为工厂方法的抽象方法,该方法返回具体产品类的实例。

具体构造者(ConcreteCreator):如果构造者是抽象类,具体构造者是构造者的子类;如果构造者是接口,具体构造者是实现构造者的类。具体构造着重写工厂方法使该方法返回具体产品实例。

工厂方法模式UML类图:

(2)工厂方法模式的优点

1)使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。

2)工厂方法使用户不必知道它使用的对象是怎样创建的,只需要知道该对象有哪些方法即可。

(3)适合工厂方法模式的情景

1)用户需要一个类的子类的实例,但不希望与盖子类形成耦合

2)用户需要一个雷的子类的实例,但是用户不知道该类有哪些子类可用。

 

2、抽象工厂模式

提供一个创建一系列或互相依赖对象的接口,而无需指定它们具体的类。设计某些系统时可能需要为用户提供一系列相关的对象,单系统不希望用户直接使用new运算符实例化这些对象,而是应当由系统控制这些对象的创建,否则用户不仅要清楚的知道使用那些类来创建这些对象,而且还必须要清楚这些对象之间是如何相关的,使得用户的代码和这些类形成紧耦合、缺乏弹性、不利于维护。

(1)设计模式的结构

抽象产品(Product):一个抽象类或接口,负责定义具体产品必须实现的方法。

具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品的实现Product接口的类。

抽象工厂(AbstractFactory):一个接口或者抽象类,负责定义若干个抽象方法。

具体工厂(ConcereteFactory):如果抽象工厂是抽象类,具体工厂是抽象工厂的子类;如果抽象工厂是接口,具体工厂是事项抽象工厂的类。具体工厂重写抽象工厂中的抽象方法,是该方法返回具体产品的实例。

抽象工厂模式的UML类图:

(2)抽象工厂模式的优点

1)抽象工厂模式可以为用户创建一系列相关的对象,是用户和创建这些对象的类解耦。

2)使用抽象工厂模式可以方便的为用户配置一系列对象。用户使用不同的具体工厂就能得到一句相关的对象,同事也能避免用户用不同系列的对象。

3)在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关的对象。

(3)适合抽象工厂模式的情景

1)系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类解耦。

2)系统需要为用户提供多个相关的对象,以便用户联合使用它们,但又不希望用户来决定这些对象是如何相关联的。

3)系统需要为用户提供一系列对象,但只需要用户知道这些对象有哪些方法可用,不需要用户知道这些对象的创建过程。

 

3、生成器模式

将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。如果一个类中有若干个成员变量是其他类声明的对象,那么该类创建的对象就可以包含若干个其他对象作为其成员。

(1)模式的结构

产品(Product):具体生成器要构造的复杂对象。

抽象生成器(Builder):抽象生成器是一个接口,该接口除了为创建一个Product对象的各个组件定义了若干个方法外,还要定义返回Product对象的方法。

具体生成器(ConcreteBuilder):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法。

指挥者(Director):指挥者是一个类,该类需含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体生成器来构造用户所需求的Product对象,如果所请求的具体生成器成功的构造了Product对象,指挥者就可以让具体生成器所构造的Product对象。

生成器模型的类图:

(2)生成器模式的优点

1)生成器模式将对象的构造过程封装在具体生成器中,用户使用不同的具体生成器就可以得到该对象的不同表示。

2)生成器模式将对象的构造过程从创建该对象的类中分离出来,使用户无需了解该对象的具体组件。

3)生成器模式将对象的构造过程与创建该对象类解耦,是对象的创建更加灵活有弹性。

4)当增加新的具体生成器是,不必修改指挥者的代码,即该模式满足开闭原则。

(3)适合使用生成器模式的情景

1)当系统准备为用户提供一个内部结构复杂的对象,而且在构造方法中编写创建该对象的代码无法满足用户需求是,就可以使用生成器模式来构造这样的对象。

2)当某些系统要求对象的构造过程必须独立于创建对象的类时。

 

四、原型模式

用原型实例指定创建对象的种类,并且通过复制这些原创创建新的对象;在某种情况下,可能不希望反复使用类构造方法创建许多对象,而是希望用该类创建一个对象后,一该对象为原型得到该对象的若干的复制品。也就是说,将一个对象定义为原型对象,要求该原型对象提供一个方法,使该原型对象调用此方法可以复制一个和自己有完全状态的同类型对象,即该方法“克隆”原型对象得到新的一个对象

(1)模式的结构

抽象原型(Prototype):一个接口,负责定义对象复制自身的方法;

具体原型(Concrete Prototype):实现Prototyp接口的类。具体原型实现抽象原型中的方法,以便所创建的对象调用该方法复制自己。

原型模式的UML类图

(2)原型模式的优点:

1)当创建类的新实例时的代价更法师,使用原型模式复制一个已有的实例可以提高创建新实例的效率。

2)可以动态的保存当前对象的状态。在运行是可以随时使用对象流保存当前对象的一个复制品。

3)可以在运行时创建新的对象,而无需创建一系列类和继承结构。

4)可以动态的添加、删除原型的复制品。

(3)适合原型模式的情景

1)程序需要从一个对象出发,得到若干个和其状态相同,并可独立变化其状态的对象时;

2)当对象的创建需要独立于他的构造过程和表示时。

3)一个类创建实例状态不是很多,那么就可以将这个类的一个实例定义为原型,那么通过复制该原型得到新的实例可能比重新使用类的构造方法创建新实例更方便。

 

五、单例模式

保证一个类有仅只有一个实例,并提供一个访问他的全局访问点。在某些情况下,我们可能需要类只能创建出一个对象,即不让用户用该类实例出多于两个的实例。

(1)模式的结构

单例模式的UML类图

(2)单例模式的优点

单件类的唯一实例由单件类本身控制,所以可以很好的控制用户何时访问它

(3)适合单件模式的情景

当系统需要某个类只能有一个实例。

 

posted on 2017-05-22 16:26  小调~  阅读(513)  评论(0编辑  收藏  举报

导航