设计模式学习笔记(五):创建型模式

来源:互联网 发布:简单的html源码下载 编辑:程序博客网 时间:2024/06/05 19:09

创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合、管理和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。

随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。当这种情况发生时,重心从对一组固定行为的硬编码(hard-coding)转移为定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为。这样创建有特定行为的对象要求的不仅仅是实例化一个类,而可能是一组复杂的对象组合。

在这些模式中有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起。整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么对象被创建,谁来创建,如何创建,以及何时创建这些方面给予设计者很大的灵活性。它们允许你用结构和功能差别很大的“产品对象”配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时)。

 

Abstract Factory

意图: 提供一个创建一系列相关相互依赖对象的接口,用于创建相关或依赖的对象家族,而无需明确指定具体类。

动机: 封装一系列相关相互依赖对象的创建,隐藏了相关对象创建过程的选取组合问题,减少错误组合的可能性。

适用性: 常用于不同软件构建环境(平台,不同的软件需求配置等)下相关对象的创建。

结构: 一般使用继承来封装不同软件构建环境。父类定义所有的一系列创建接口,由具体类实现。本质上抽象工厂由多个工厂方法组成(每个子类均为对象工厂)

优点: 减少对象错误组合使用的可能性。

 

Factory Method

意图:定义一个用于创建对象的接口,让子类决定将哪一个类实例化FactoryMethod使一个类的实例化延迟到其子类。

动机: 让子类自己决定所需创建的对象,这里的对象一般并非子类本身,而是子类所需要的其他对象。本质:通过子类来创建对象,使客户仅依赖父类的抽象接口。

适用性: 常用于调用统一的抽象类接口,而让子类自己决定(实现)所需创建的对象,由此,封装了子类所创建对象的类型。

结构: 一般内嵌于具有继承关系的子类中,很少单独使用。抽象类提供创建接口,子类实现。典型例子: STL中迭代器的创建(end()begin())。常用抽象接口:MakeObj()CreateObj()

优点: 封装了子类所创建对象的类型。

组合模式: 经常用于TemplateMethod中的子类中,使创建过程成为TemplateMethod的一个步骤。

Note:实际中,设计者常常使用专门的工厂类负责相关对象的创建,这不同于FactoryMethod,但都属于对象工厂(负责创建对象的类)

 

 

Builder

意图: 将一个复杂对象(一般内部含有多个其他对象)的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

动机: 封装复杂对象或具有多种组合的对象的创建过程。比如提供不同的接口表示同一个对象不同的构建过程。

适用性: 常用于封装具有可变构建过程的对象。

结构: 提供不同的接口封装不同的构建过程;提供较小粒度的接口,封装构建过程中对象间的交互关系,让客户通过提供的接口自己合成创建过程。

优点: 要么封装整个对象的构建,要么封装了创建过程中对象间的交互关系。

组合模式: 经常用于封装Composite的创建过程(提供小粒度的对外接口)

 

Prototype

意图:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

动机: 拷贝已有对象(包括状态).

适用性: 常用于包含状态的对象拷贝,简化状态的同步过程。典型例子CAD

结构: 对象既有自拷贝的对外接口。注意区分浅拷贝和深拷贝,多线程也需要注意。

优点: 简化了对象状态的重新构建。向客户隐藏制造新实例的复杂性;提供让客户能够产生未知类型对象的途径;有时复制对象更高效。

组合模式: 有时与工厂Factory一同使用,通过单一的接口来创建所需的对象。(Map+clone)

 

Singleton

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

动机: 保证一个类仅有一个实例。

适用性: 方便对象的全局访问;或在当对象因存在多个副本引发性能问题时,才考虑使用Singleton来限制对象实例化。

结构: 常常和静态变量等相关.

优点: 方便全局访问,限制对象实例化,解决系统的性能问题

缺点: Singleton本质上是一个全局变量,全局变量并不是什么好东西,不好管理,且容易引发其他问题。一般并不推荐使用Singleton.

 

ObjectPool

意图: 在创建对象比较昂贵,或者所能创建对象(File/socket)数目有限制时,管理对象的重用

动机: 封装对重用对象的管理。

适用性: 当对象的创建和/或管理必须遵循一组定义明确的规则集, 并且这些规则都与如何创建对象、创建多少对象和在已有对象完成当前任务时如何重用等相关时,使用Object Pool来创建和管理对象。

结构: 类似于简单的Factory,即使用单独的类。

优点: 封装对重用对象的管理。

 

CreationMethod

意图: 基于类的不同构造函数,提供多种不同的对象构建过程

动机: 使用不同的Creation函数(语义明确)来区别所创建对象的用途(意图)

适用性: 类中存在多种不同的构造函数,并且每种构造函数所构建的类有不同的用途/意图。

结构: 一般Creation函数需要是static函数,根据所使用的语言而定。类的构造函数为私有。

优点: 根据不同的Creation函数名,可以很清楚的描述构建对象的用途。

变化: 有时直接把派生类的构建直接放入抽象类中,并使用Creation Method

 

待续......

 

原创粉丝点击