java-设计模式汇总整理
最近,对各种模式做了一个整理,便于后续自用。
1、工厂模式
总结:很好理解,一个接口,2个类实现这个接口,那么可以用“接口 变量=new 接口实现类”的方式调用不同的实现类,调用方式直接使用接口的方法就完成了不同实现类的业务调用。
2、抽象工厂
总结:工厂模式的一种变形。
3、单例模式
总结:防止过度的new引用,在引用的时候判断是否已完成实例化,如已完成则不再new而是直接返回。
12、享元模式
总结:单例模式的集合版。单例模式是返回一个对象的实例化,而享元模式是把各种单例存储到一个集合中,当发生调用时从这个集合取得单例并返回。
13、策略模式
总结:很类似工厂模式,但工厂模式返回实现的接口类,而策略模式是在外部就确定了要使用哪个实现类来执行指定的方法。
20、状态模式
总结:很类似工厂模式,但工厂模式返回实现的接口类,而状态模式是在内部经过传入的条件判断后返回实现接口类的指定方法。
解释:相当于If else if else;设计路线:各个State类的内部实现(相当于If,else If内的条件),执行时通过State调用Context方法来执行。 状态模式是让各个状态对象自己知道其下一个处理的对象是谁,即在编译时便设定好了的;
4、建造者模式
总结:类似外观模式,提供按照顺序的外观模式。但与外观模式的区别是外观模式不关注顺序,而建造者要关注执行的顺序本身。
9、外观模式
总结:为子系统中的一组接口提供一致的界面,fade提供了一高层接口,这个接口使得子系统更容易使用。
11、组合模式
总结:组合模式也很类似外观模式和建造者模式,但是不一样的地方是建造者关注顺序本身,外观模式关注各个方法实现就可以,组合模式关注各个方法实现的结果并做对应处理。
22、中介者模式
总结:类似外观模式,但关注行为的提供。
7、装饰模式
总结:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
8、代理模式
总结:为其他对象提供一种代理以控制对这个对象的访问。例一个接口A及A的实现类B,那么可以定义实现类C,C除实现A的方法外还保留其他方法的提供,那么使用者可以直接使用C,其中A接口的实现的方法可以由C来提供。
看到现在,我们会觉得装饰模式和代理模式是很像的,那么区别在于什么地方?装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
18、命令模式
总结:把最终实现接口类的行为再次接口化,使用者调用再次接口化的接口并传入实现者以实现行为。
5、原型模式
总结:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
6、适配器模式
总结:定义一个接口A,比如接口有方法AA,抽象类B含有AA方法及AAA方法,那么我们想用A接口的实现的方法及B类中的AAA方法时,可以创建一个类C继承抽象类B,并且实现接口A,那么在使用C的时候就可以用到接口A里面的AA方法(非B里面的AA方法)及B里面的AAA方法。
10、桥接模式
总结:
14、模板模式
总结:
15、观察者模式
总结:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
16、迭代子模式
总结:
17、责任链模式
总结:通过接口实现并在实现内部可以传入接口实现,以此类推,在实现调用时可以呈现线性传递的方式。
解释:相当于Swich case 设计路线:客户设定,每个子类(case)的参数是下一个子类(case)。使用时,向链的第一个子类的执行方法传递参数就可以。而职责链模式中的各个对象并不指定其下一个处理的对象到底是谁,只有在客户端才设定。
19、备忘录模式
总结:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
21、访问者模式
总结:很少用,未精读理解。
23、解释器模式
总结:很少用,未精读理解。
各种总结:
中介模式和外观模式的区别:首先中介者模式将多对多的相互作用转化为一对多的相互作用(也就是各个系统可以互相作用,注意这里强调的是各个系统之间的作用,为了简化这些子系统间的作用,就采用中介者模式)
然而外观模式模式(Facade模式)提供一个高层次的接口,使得子系统更易于使用(注意这里强调的是为了让外部更容易使用这些子系统,所以统一放在一个对象中)
2.外观模式是结构型模式,中介者模式是行为型模式。
3.外观模式是对子系统提供统一的接口,中介者模式是用一个中介对象来封装一系列同事对象的交互行为。
4.外观模式协议是单向,中介者模式协议是双向。
5.外观模式所有的请求处理都委托给子系统完成,而中介者模式则由中心协调同事类和中心本身共同完成业务
策略模式和命令模式的区别:策略模式和命令模式的其中一个最大区别,是在于:策略模式对付的问题域通常是一个,就是说,多个策略只是处理同一个问题,而命令模式对付的是多个问题域,就是很多不同的命令来做不同的事情。简单点来说就是前一个是封装算法 后一个是封装动作。
=====================================================
补充另一片文章对设计模式的理解
设计模式是不分语言的;前辈们总结出来的设计模式分:3种类型及23种模式:
设计模式主要分三个类型:创建型、结构型和行为型。
其中创建型有:
一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点
二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。
三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
四、Builder,建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
五、Prototype,原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。
行为型有:
六、Iterator,迭代器模式:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示。
七、Observer,观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
八、Template Method,模板方法:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可以重定义该算法得某些特定步骤。
九、Command,命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作。
十、State,状态模式:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类。
十一、Strategy,策略模式:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户。
十二、China of Responsibility,职责链模式:使多个对象都有机会处理请求,从而避免请求的送发者和接收者之间的耦合关系
十三、Mediator,中介者模式:用一个中介对象封装一些列的对象交互。
十四、Visitor,访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这个元素的新操作。
十五、Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
十六、Memento,备忘录模式:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
结构型有:
十七、Composite,组合模式:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性。
十八、Facade,外观模式:为子系统中的一组接口提供一致的界面,fa?ade提供了一高层接口,这个接口使得子系统更容易使用。
十九、Proxy,代理模式:为其他对象提供一种代理以控制对这个对象的访问
二十、Adapter,适配器模式:将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
二十一、Decrator,装饰模式:动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
二十二、Bridge,桥模式:将抽象部分与它的实现部分相分离,使他们可以独立的变化。
二十三、Flyweight,享元模式