目录
1.创建型设计模式:关注对象的创建,new的花样就有很多 5种
2.结构型设计模式:关注类与类之间的关系,关系有很多种,"组合优于继承" 7种
3.行为型设计模式:关注对象的行为的关系(类与方法),就是方法到底该放到哪里 11种
1.创建型设计模式:关注对象的创建,new的花样就有很多 5种
1.1工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类吧实例化推迟到子类。
1.2抽象工厂模式
提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
1.3单例模式
确保一个类只有一个实例,并提供一个全局访问点。
优点:有些对象其实只需要一个:比如线程池,缓存,对话框,
缺点:违反单一职责,因为它既负责创建自己又提供全局访问
1.4建造者模式
封装一个产品的构造过程,并允许按步骤构造。
优点:
将一个复杂对象的创建过程封装起来
允许对象通过多个步骤的工厂模式不同
向客户隐藏产品内部的表现
产品的实现可以被替换,因为客户只看到一个抽象的接口
缺点:
经常被用在创建组合结构
与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。
1.5原型模式
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式
优点:
向客户隐藏制造新实例的复杂性。
提供让客户能够产生未知类型对象的选项
在某些环境下,复制对象比创建对象更有效。
缺点:
在一个复杂的类层次种,当系统必须从其中的许多类型创建新对象,可以考虑原型
对象复制有时相当复杂
2.结构型设计模式:关注类与类之间的关系,关系有很多种,"组合优于继承" 7种
2.1装饰器模式
动态的将责任附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。
2.2适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
2.3外观模式
提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
2.4组合模式
允许你将对象组合成树形结构来表型“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
2.5代理模式
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
2.6桥接模式
使用桥接不只改变你的实现,也改变你的抽象
优点:
将实现予以解耦,让它和界面之间不再永久绑定
抽象和实现可以独立扩展,不会影响对方
对于“具体的抽象类”所作的改变,不会影响到客户
缺点:
适合使用在需要跨越多个平台的图形和窗口系统上
当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用
桥接模式的缺点时增加了复杂度
2.7享元模式
如果想让某个类的一个实例能用来提供许多”虚拟实例“,就是用享元模式
优点:
减少运行时对象实例的个数,节省内存。
将许多”虚拟“对象的状态集中管理
缺点:
当一个类有许多的实例,而这些实例能被同一个方法控制时,我们就可以使用享元模式
一旦你实现了它,那单个逻辑实例无法拥有独立而不同的行为。
3.行为型设计模式:关注对象的行为的关系(类与方法),就是方法到底该放到哪里 11种
3.1策略模式
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
3.2观察者模式
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
3.3访问者模式
当你想要为一个对象的组合增加新的能力,且封装并不重要时
优点:
允许你对组合结构加入新的操作,而无需修改结构本身
想要加入新的操作,相对容易
访问者所进行的操作,其代码是集中在一起的
缺点:
当采用访问者模式的时候,就会打破组合类的封装
因为游走的功能牵涉其中,所以对组合结构的改变就更加困难
3.4命令模式
将“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其他对象。命令模式也支持可撤销的操作。
3.5模板方法模式
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
LINQ的实现可以看作是一种特殊的模板方法,将大部分的代码写好,而将部分代码通过委托的形式交给客户端
3.6迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
3.7状态模式
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
3.8责任链模式
当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式
优点:
将请求的发送者和接收者解耦
可以简化你的对象,因为它不需要知道链的结构。
通过改变链内的成员或调动它们的次序,允许你动态的新增或者删除责任
缺点:
经常用在窗口系统中,处理鼠标和键盘之类的事件。
并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端之外
可能不容易观察运行时的特征,有碍于除错。
3.9解释器模式
使用解释器模式为语言创建解释器。
优点:
将一个语法规则表示成一个类,方便于实现语言。
因为语法由许多类表示,所以你可以轻易地改变或扩展此语言
通过在类结构中加入新方法,可以在解释的同时增加新的行为,例如打印的美化或者进行复杂程序验证
缺点:
当你需要实现一个简单的语言时,使用解释器
当你有一个简单的语法,而且简单比效率更重要时,使用解释器。
可以处理脚本语言和编程语言
当语法规则的数目太大时,这个模式可能会变得非常繁杂,在这种情况下,使用解析器/编译器得产生器可能更合适。
3.10中介者模式
使用中介者模式来集中相关对象之间的复杂沟通和控制方式
优点:
通过将对象彼此解耦,可以增加对象的复用性
通过将控制逻辑集中,可以简化系统维护
可以让对象之间所传递的消息变得简单而大幅减少。
缺点:
中介者常常被用来协调相关的GUI组件
中介者模式如果设计不当,中介者对象本身会变得过于复杂
3.11备忘录模式
当你需要让对象返回之前的状态时,例如撤销
优点:
将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚
保持关键对象的数据封装
提供容易实现的恢复能力
缺点:
备忘录用于储存状态
使用备忘录的缺点:储存和恢复状态的过程可能相当耗时
在Java系统中,其实可以考虑使用序列化机制储存系统的状态