第二章
层次结构信息的表述一般是经过一种被称为递归组合的技术来实现的。递归组合能够由较简单的元素逐渐创建复杂的元素。算法
得到跨越硬件和软件平台的可移植性是系统设计的主要问题之一。移植的一大障碍是不一样视感标准之间的差别性。设计模式
一个平台将多个互相重叠的窗口展现在一个点阵显示器上。数据结构
图源抽象的一个重要做用就是隐藏了存储其子图源的数据结构,咱们能够在不影响其余类的状况下改变图元的数据结构。测试
图元接口不该该偏重于某个数据结构。ui
一个好的解决方案是封装那些变化的概念。设计
分析对象怎样才能不使用类型测试或强制类型转换也能正确对待各类不一样的图元。代理
第三章 建立型模式
建立型模式实例化了过程。对象
设计模式中两个不断出现的主旋律:递归
- 它们都将关于该系统使用哪些具体的类的信息封装起来
- 隐藏了这些类的实例是如何被建立和放在一块儿的
整个系统关于这些对象所知道的是由抽象类所定义的接口接口
Abstract Factory(抽象工厂)——对象建立型模式
提供一个建立一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用:
- 一个系统要独立于它是产品建立、组合和表示时
- 一个系统要由多个产品系列中的一个来配置时
- 当你要强调一系列相关的产品对象的设计以便进行联合适用时
- 提供一个产品类库,而只想显示它们的接口而不是实现时
优缺点:
- 分离了具体的类
- 使得易于交换产品系列
- 有利于产品的一致性
- 难以支持新种类的产品
一些实现:
- 将工厂做为单件
- 建立产品
- 定义可扩展的工厂
一个具体的工厂一般是一个单件的
Builder(生成器)——对象建立模型模式
将一个复杂对象的构建与它的表示分离,使得一样的构建过程能够建立不一样的表示。
每个转换器类建立和装配一个复杂对象的机制隐含在抽象接口的后面。
适用:
- 当建立复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
- 当构造过程必须运行被构造的对象有不一样表示时
效果:
- 它使你能够改变一个产品的内部表示
- 它将构造代码和表示代码分开
- 它使你对构造过程进行更精细的控制
Builder模式着重于一步步构造一个复杂对象。而Factory Method着重于多个系列的产品对象。Builder在最后一步返回厂品,而对于Abstract Factory来讲,产品是当即返回的。
Factory Method(工厂方法)——对象建立型模式
定义一个用于建立对象的接口,让子类决定实例化哪个类。
适用:
- 当一个类不知道它所必须建立的对象的类的时候、
- 当一个类但愿由它的子类来指定它所建立的对象的时候
- 当类将建立对象的职责委托给多个帮助子类的某一个,而且你但愿将哪个帮助子类是代理者这一信息局部化的时候
效果:
- 为子类提供挂钩
- 链接评选的类层次
实现:
- 主要两种不一样的状况
- 是一个抽象类而且不提供它所声明的工厂方法的实现
- 是一个具体类并且为工厂方法提供一个缺省的实现
- 参数化工厂方法
- 特定语言的变化和问题
- 使用模板以免建立子类
Prototype(原型)——对象建立型模式
用原型实例指定建立对象的种类,而且经过拷贝这些原型建立新的对象。
当一个系统应该独立于它的产品建立、构成和表示时,要用Prototype模式或
- 当要实例化的类是在运行时刻指定时
- 为了不建立一个与产品类层次平行的工厂类层次时
- 当一个类的实例只能与几个不一样状态组合中的一种时
优势:
- 运行时刻增长和删除产品
- 改变值以指定新对象
- 改变结构以指定新对象
- 减小子类构造
- 用类动态配置应用
考虑的问题:
- 使用一个原型管理器
- 实现克隆操做
- 初始化克隆对象
Singleton(单件)——对象建立型模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
一个全局变量使得一个对象能够被访问,但它不能防止你实例化多个对象。一个更好的办法是让类自身负责保存它的惟一实例。
适用:
- 当类只能有一个实例并且客户能够从一个众所周知的访问点访问它时
- 当这个惟一实例应该是经过子类化可扩展的,而且客户应该无需更改代码就能使用一个扩展的实例时
优势:
- 对惟一实例的受控访问
- 缩小名空间
- 容许对操做和表示的精化
- 容许可变数目的实例
- 比类操做更灵活
问题:
- 保证一个惟一实例
- 建立类的子类