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

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

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

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

 

Abstract Factory

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

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

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

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

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

 

Factory Method

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

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

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

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

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

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

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

 

 

Builder

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

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

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

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

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

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

 

Prototype

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

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

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

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

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

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

 

Singleton

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

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

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

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

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

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

 

Object Pool

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

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

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

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

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

 

Creation Method

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

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

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

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

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

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

 

待续......

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值