一、创建型: 1.单例模式99% 2.简单工厂模式99% 3.工厂方法模式60%
5.抽象工厂模式30% 5.建造者模式10% 6.原形模式10%
二、结构型: 代理模式99 装饰器模式99 享元模式90 外观模式60
适配器模式40 桥接模式20 组合模式30
三、行为型:迭代器模式99 模板方法模式80 策略模式60
观察者模式40 命令模式20 状态模式20 职责链模式15 解释器模式1 中介者模式10 访问者模式5 备忘录模式5
一、创建型:
1.1单例模式99%
设计原则:无
常用场景:应用中有对象需要是全局的且唯一
复杂度:低
选择关键点:一个对象在应用中出现多个实例是否会引起逻辑上或者是程序上的错误
逆鳞:在以为是单例的情况下,却产生了多个实例
相关设计模式
原型模式:单例模式是只有一个实例,原型模式每拷贝一次都会创造一个新的实例。
1.2简单工厂模式99%
设计原则:遵循单一职责、违背开闭原则
常用场景:需要在一堆产品中选择其中一个产品
复杂度:低
变化点:产品的种类
选择关键点:一种产品是否可根据某个参数决定它的种类
逆鳞:工厂类不能正常工作
相关设计模式
工厂方法模式:工厂方法模式是简单工厂模式的进一步抽象化,在这两者之间做选择,主要看将工厂进一步抽象化是否有必要,通常情况下,如果工厂的作用仅仅是用来制造产品,则没必要使用工厂方法模式。
1.3工厂方法模式60%
设计原则:遵循单一职责、依赖倒置、开闭原则
常用场景:一种场景是希望工厂与产品的种类对客户端保持透明,给客户端提供一致的操作,另外一种是不同的工厂和产品可以提供客户端不同的服务或功能
复杂度:中低
变化点:工厂与产品的种类
选择关键点:工厂类和产品类是否是同生同灭的关系
相关设计模式
抽象工厂模式:工厂方法模式与抽象工厂模式最大的区别在于,在工厂方法模式中,工厂创造的是一个产品,而在抽象工厂模式中,工厂创造的是一个产品族。
二、结构型:
组合比继承耦合度低,满足“合成复用原则”,对象结构型比类结构型更灵活
2.1代理模式99
设计原则:体现功能复用
常用场景:需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作,假设这些类有一致的接口,可使用JDK的动态代理,否则可使用cglib
复杂度:中高
变化点:静态代理没有变化点,动态代理的变化点为具有相同切入点的类
选择关键点:静态代理选择的关键点是是否要复用被代理的部分功能,动态代理选择的关键点在于能否在将被代理的这一批类当中,找出相同的切入点
逆鳞:切入点的不稳定
相关设计模式
适配器模式:对于适配器模式当中的定制适配器,它与静态代理有着相似的部分,二者都有复用功能的作用,不同的是,静态代理会修改一部分原有的功能,而适配器往往是全部复用,而且在复用的同时,适配器还会将复用的类适配一个接口
2.2.装饰器模式99
设计原则:遵循迪米特、单一职责、开闭原则,破坏里氏替换,体现功能复用
常用场景:一个类需要动态的添加功能,且这些功能可以相互叠加
使用概率:99.99999%
复杂度:中
变化点:动态添加的功能或者说装饰器
选择关键点:添加的功能是否需要动态组装
逆鳞:无
2.3享元模式90
设计原则:无
常用场景:一些状态相同的对象被大量的重复使用
复杂度:中
变化点:无
选择关键点:被共享的对象是否可以将外部状态提取出来
逆鳞:没有将外部状态提取完全
2.4外观模式60
设计原则:遵循迪米特
常用场景:一个子系统需要对外提供服务
复杂度:中
变化点:无
选择关键点:子系统对外提供服务是否需要依赖很多的类
逆鳞:子系统对外提供的服务的变化或子系统本身的不稳定
相关设计模式
中介者模式:二者都是为了处理复杂的耦合关系,不同的是外观模式处理的是类之间复杂的依赖关系,中介者模式处理的是对象之间复杂的交互关系
三、行为型:
3.1迭代器模式99
设计原则:遵循迪米特
常用场景:需要迭代访问一个聚合对象中的各个元素,且不暴露该聚合对象内部的表示
复杂度:中
变化点:聚合对象的种类
选择关键点:客户端是否关心遍历的次序
相关设计模式
访问者模式:二者都是迭代的访问一个聚合对象中的各个元素,不同的是,访问者模式中,扩展开放的部分在作用于对象的操作上,而迭代器模式中,扩展开放的部分在聚合对象的种类上,而且二者的实现方式也有着很大的区别。
3.2模板方法模式80
设计原则:破坏里氏替换,体现功能复用
常用场景:一批子类的功能有可提取的公共算法骨架
复杂度:中低
变化点:算法骨架内各个步骤的具体实现
选择关键点:算法骨架是否牢固
3.3策略模式60
设计原则:遵循单一职责、依赖倒置、迪米特、开闭原则
常用场景:算法或者策略需要经常替换
变化点:策略种类
选择关键点:客户端是否依赖于某一个或若干个具体的策略
结束语
99.99999%数字,嵌入JAVA类库或常用框架,比如迭代器模式,ArrayList或者HashSet。
1、看不明白放下,哪天突然明白。(顿悟常发生在洗澡、回家路上)
2、不能改善现有的系统架构,但不要轻易付诸实践。
3、明白UML类图,关联,依赖,聚合,组合
4、写例子,哪怕是比葫芦画瓢,体会使用前后的差异,从扩展性和类(类包括客户端,而不仅仅指设计模式中的角色)职责两个方面。
5、设计模式变化点搞清楚,重要程度高于设计模式的场景、实现方式以及类和对象之间的耦合关系,滥用就是变化点没搞清楚,该变化的没变化,不该变化的经常变化,增加系统负担。
6、经常回过头来看看,不一样体会,体会会越来越深刻,越来越透彻。
7、多研究开源框架,找里面设计模式。
http://www.cnblogs.com/zuoxiaolong/p/pattern26.html
行为型模式 11 种模式
1.模板方法(Template Method)模式:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
2.策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
3.命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
4.职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
5.状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
6.观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
7.中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
8.迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
9.访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
10.备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
11.解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。