五个构造模式:
- 工厂方法(创建单个对象):
将创建对象的工程封装在工厂方法里,用来选择相应的类来创建对象。
好处:
- 权限控制:工厂方法统一管理创建对象的权限,客户对象不需要承担权限检查的职责
- 细节隐藏:工厂方法隐藏可创建对象的细节。
- 类型隐藏:将选定的类实例作为父类类型(接口)的对象返回,客户对象无需了解类层次结构中的类是否存在。
==========================================================================================
- 单例(创建全局唯一的对象):
在应用程序的生命周期中,确保有且仅有全局唯一的实例对象。
- 实现步骤:
- 定义一个私有静态成员变量
- 构造函数私有化
- 创建一个静态获取静态变量(先判断静态变量是否为空,若空则new一个,最后返回静态变量)
==========================================================================================
- 抽象工厂(创建一系列对象):
提供接口生成一系列对象(可用接口或抽象类来实现)
好处:
- 隔离了具体类的生产
- 保证始终只用同一个产品族中的对象
- 符合开闭原则
==========================================================================================
- 原型模式(创建大量对象):
在需要创建类似或相同的对象时,简化了对象的创建。(浅复制、深复制)
==========================================================================================
- 构造者模式(创建复杂的对象):
在对象的创建过程中,把经常变化的地方(构造逻辑)从构造器中提取出来
================================================================================================================================================================================================
四个集成模式:
- 合成模式:
允许单个对象和合成对象被以一种统一的方式访问
提供公共接口,同时兼容独立组件和复合组件
- 独立对象(组件):由一些单独的组件构成
- 合成对象(组件):由其他复合组件构成
==========================================================================================
- 迭代模式:
允许客户对象用一致的方式,提供一个公共接口访问容器中的内容。
- 内部迭代子:集合(容器)本身提供了一些方法允许客户访问该集合中的不同对象
- 外部迭代子:迭代功能与集合类不在同一个类
==========================================================================================
- 享元模式:
将公共数据分离出来,避免每个对象保存相同的内部信息。
- 内部信息:独立于对象所处的环境
- 外部信息:与对象所处环境有关的
==========================================================================================
- 访问者模式:用于对集合的操作。
将操作定义在访问者类中,使得集合操作从它所要操作的对象中分离出来。
对于每一个新的操作,都有一个新的访问者类。
================================================================================================================================================================================================
十一个结构模式:
- 装饰器:ConcreteComponent、Decorator、ConcreteDecoratorABCDE…
在目标对象外围创建相同的接口来添加方法(动态扩展对象的功能)
特性:
- 拥有与底层对象相同的接口
- 装饰器对象包含实际对象的引用
- 接受客户对象的所有请求,然后转发给底层对象
==========================================================================================
- 适配器:解决兼容性问题(挂羊头卖狗肉)
在接口不相容的对象外围定义一个封装类,提供客户所期待的接口,实现将客户对象的调用转换为对适配源类接口的调用
- 类适配器:类适配器继承适配源类,返回客户对象所期望的接口。当客户对象调用一个适配器方法的时候,适配器在内部调用它继承来的一个适配源方法。
- 对象适配器:对象适配器拥有适配源对象的一个引用,实现客户对象所期望的接口
==========================================================================================
- 责任链:在发送请求的对象和该请求的潜在对象集之间建立一种低耦合的关联关系
- 潜在处理对象的链条顺序可以在运行是动态决定
- 所有的潜在处理对象都应该提供一个一致的接口
- 不论客户对象还是链中任一个处理对象,都不需要知道是哪一个对象完成了请求
- 不能保证请求一定能够得到处理
==========================================================================================
- 外观:用于处理子系统对外接口的问题
好处:隐藏细节,避免客户对象与子系统对象之间有过多的依赖
- 外观类不提供超出子系统的其他额外功能
- 不要从外观类的方法里返回内部类的引用
- 外观类的接口最好是一种综合的商业事务层次的方法(全部成功/失败)
==========================================================================================
- 代理:Subject、RealSubject、Proxy
当客户对象不是直接去访问目标对象,而是通过代理对象去访问,允许不同的客户对象以一种更为普通和直接的方式来间接访问到目标对象。
- 代理对象和目标对象有同样的接口,代替客户去和目标对象打交道,并负责处理和目标对象之间交流上的其他细节。
- 客户不需要满足目标对象的特别需求就可以访问其服务。
特性:
- 是客户对象和目标对象之间的一个中介。
- 接收客户对象的请求,并把它转发给目标对象。
==========================================================================================
- 桥接:把抽象体的接口和实现分离
- 抽象体:把对象和具体用途相关的属性和行为分离出来的表现形式。
- 一个对象是一系列抽象体的集合,其中每一个抽象体只包含该项功能的相关属性和行为,彼此不干扰。
==========================================================================================
- 虚代理:
- 节省内存,确保对象只在被用到的时候才创建
- 虚代理中带有实际代理的引用
- 程序启动速度快,提升用户体验
- 但无法确认对象是否被创建好,每次访问都要检查
==========================================================================================
- 计数代理:
把额外操作(具体功能中与业务无关的部分)的代码封装到另一个类中
==========================================================================================
- 显示对象释放:
对象不再被需要时,其使用的外部资源应当被主动、及时地释放掉
- finalize(),Object对象的方法
- finally语句,不依赖于垃圾回收过程
==========================================================================================
- 对象缓存器:
把对象的一个副本放在内存里,以便提高后续对它的访问速度
==========================================================================================
- 聚合强制器
- 一个对象包含其他对象时,被称为聚合对象
- 此模式旨在保证当聚合对象被创建时,它必须是被完整创建的。
================================================================================================================================================================================================
行为模式
- 命令:
消除客户发布请求的调用者于提供服务的接收者对象组之间的耦合度
==========================================================================================
- 调停者:
避免对象相互直接引用的需要(与外观类似)
操作:
建议抽象所有对象的交互细节到Mediator的独立类中,不同的对象之间的交互通过Mediator类间接处理
好处:
- 通过使用调停者的子类来替换调停者,更容易改变对象交互联系的行为
- 把交互对象的依赖关系放到对象个体之外,提高对象的可重用性
- 对象的单元测试变得更加简单
- 降低对象的耦合度
==========================================================================================
- 备忘录:
捕获并存储一个对象的状态(某一时间的属性),以便在需要时能够恢复到原来的状态(undo操作)
==========================================================================================
- 观察者:
- 用于设计一组非独立对象和依赖的对象之间的一直通讯模型,允许非独立对象的状态与依赖的对象之间同步(一种发布者—订阅模型)
- 观察者是一个对目标的状态有兴趣或者依赖的对象,一个目标可以有一个或多个观察者。观察者都需知道目标在什么时候改变状态,目标的观察者列表是可以动态变化的。
- 目标应该提供register、noregister和notify()接口
==========================================================================================
- 解释器:
用于设计编译一组规则的通用组合
- 设计一个类层次结构来表示一组语法规则,每一个类表示一个独立的语法规则;
- 设计一个解释器模块来解释语句以执行必要的操作,其由上面设计的类构成。
==========================================================================================
- 状态:
用于设计一个有效的类结构(Context类),类的一个特定实例可以有多个状态,并根据状态表现不同行为。当Context对象的内部状态改变时,它可以改变其行为。
操作:
- 将与状态相关的行为从Context类中独立出一个类(State类)来
- Context的不同状态对应到一个独立的State类
- State类的实现包含状态特定的行为,而不包括Context类的所有行为
(去掉过多的条件状态判断)
==========================================================================================
- 策略:
将每个算法(策略Strategy)的实现放在单独的类中。为使得Context对象能无缝访问不同的Strategy对象,所有的策略对象必须提供相同的接口
================================================================================================================================================================================================
七个基本模式
- 接口模式
- 抽象父类
- 私有方法
- 存取器
- 常量数据管理器
- 不变对象
- 管程:
通过对资源加锁,保证在任意一个时刻只有一个线程可以访问该对象的任何方法
使用关键字synchronizatied