创建型模式(共五种)
工厂方法模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
个人总结: 通过对象工厂灵活地生产多种对象
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
个人总结:工厂模式 >> 一种工厂,多种对象 ; 抽象工厂模式 >> 一种抽象工厂,多种工厂,每个工厂又可以生产多种对象
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
个人总结:在类内部创造单一对象,通过设置构造方法权限,使类外部无法再创造对象
建造者模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
个人总结:将一些不会变的基本组件,通过builder,组合,构建复杂对象,实现分离
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
个人总结:将对象复制了一份并返还给调用者,对象需继承Cloneable并重写clone()方法
结构型模式(共七种)
适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
个人总结:衔接两个不兼容、独立的接口的功能,使得它们能够一起工作。适配器起中介作用。
装饰器模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
个人总结:创建类的装饰类,对被装饰类增强功能。装饰模式是继承的一个替代模式。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
个人总结:创建类的代理类,间接访问被代理类的过程中对其功能加以控制,例如在某个函数执行前后添加额外功能。(代理例子:买火车票不一定在火车站买,也可以去代售点)。 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制,”形式”虽然相似,”语义”却截然不同”。起中介作用
外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
个人总结:在客户端和复杂系统之间再加一层,在这一层中将调用顺序、依赖关系等处理好。提供一个容易使用的外观层。
桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化。
个人总结:通过对Bridge类的调用,实现了对同一接口下不同实现类的调用;建立一个继承于同一抽象的不同实现类之间的关联关系,这个关系由Bridge类桥接起来。
组合模式:将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
个人总结:创建了一个包含自己对象组的类,并提供修改对象组的方法。应用场景,如树形菜单,文件、文件夹的管理。
享元模式:运用共享技术有效地支持大量细粒度的对象。
个人总结:重用现有的同类对象,若未找到匹配的对象,则创建新对象。例如,数据库的连接池。减少对象的创建,降低系统内存,提高效率。
行为型模式(共十一种)
策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
个人总结:统一接口下的一系列算法类(多种策略),用一个类将其封装起来,使它们(多种策略)可动态切换。 和工厂模式的区别:工厂模式是创建型模式,是为了创建不同对象;而策略模式是行为模式,为了选择不同的行为。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
个人总结:将一些固定步骤、固定逻辑的方法封装成模板方法。调用模板方法即可完成那些特定的步骤。例如,spring中对Hibernate的事务管理,开启session、关闭session等固定步骤不需重复写,直接丢给一个实体保存。
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
个人总结:一个对象(被观察者)状态变化时,通知所有依赖于它的对象(观察者);这种依赖方式具有双向性:观察者指定被观察的对象,或者被观察对象添加观察者,下面例子采用后者方式
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
个人总结:Java中的iterator的简单实现原理。将聚合类中遍历各个元素的行为分离出来,封装成迭代器,让迭代器来处理遍历的任务;使简化聚合类,同时又不暴露聚合类的内部。
责任链模式:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
个人总结:在Handler类里面聚合自己,形成一条Handler链(或树、环等),并且可以将请求往下一个Handler传递(只允许传给另一个,而不允许传给多个)。例子:Struts拦截器,Filter过滤器
命令模式:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
个人总结:三种角色(调用者→接受者→命令);解耦行为请求者和行为实现着,实现请求和执行分开;调用者选择命令发布,命令指定执行者。
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
个人总结:创建一个备忘录类,用来存储原始类的信息;同时创建备忘录仓库类,用来存储备忘录类,当然,原始类与备忘录类的对应关系要处理好。
状态模式:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
个人总结:对象具有多种状态,且每种状态具有特定的行为;应用场景: 行为随状态改变而改变的场景。代码形式似乎也和哪种设计模式相似,还是那句话,设计模式提倡的是思想,而不是形式。
访问者模式:主要将数据结构与数据操作分离。
个人总结:在被访问的类里面加一个对外提供接待访问者的接口(如下面例子的accept()方法)。访问者封装了对被访问者结构的一些杂乱操作,避免这些操作”污染”被访问者,解耦结构与算法,同时具有优秀的扩展性。
中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
个人总结:中介者对象,用来封装关联对象之间的交互操作,使关联对象之间耦合度松散;例如,MVC模式中”控制器”就是”模型”和”视图”的中介者;与适配器模式的区别:适配器模式为了桥接互不兼容的接口,中介者为了分离原始结构和交互行为。
解释器模式:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
个人总结:自己定义一种语言或表达式(附对应的解释器),用来表示一些复杂的频繁发生的行为。例如:正则表达式的解释,sql语句的解释。使用场景极少,会引起效率、性能、维护等问题。
Original: https://www.cnblogs.com/zhangzongjian/p/4737174.html
Author: zhangzongjian
Title: 23种设计模式概要及易懂的例子
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606436/
转载文章受原作者版权保护。转载请注明原作者出处!