java的设计模式
一、设计模式的分类
总体来说分三大类(共二十三种)
创建型模式(有五种):
1.工厂方法模式(Factory Method)
2.抽象工厂模式(Abstract Factory)
3.单例模式(Singleton)
4.建造者模式(Builder)
5.原型模式(Prototype)
6.对象池模式(Object pool)
结构型模式(有七种):
1.适配器模式(Adapter)
2.装饰器模式(Proxy)
3.代理模式(Proxy)
4.外观模式(Facade)
5.桥接模式(Bridge)
6.组合模式(Composite)
7.享元模式(Flyweight)
行为型模式(有十一种):
1.策略模式(Strategy)
2.模板方法模式(Template Method)
3.观察者模式(Observer)
4.迭代子模式(Iterator)
5.责任链模式(Chain of Responsibility)
6.命令模式(Command)
7.备忘录模式(Memento)
8.状态模式(State)
9.访问者模式(Visitor)
10.中介者模式(Mediator)
11.解释器模式(Interpreter)
两类特殊模式
1.并发型模式
2.线程池模式
二、设计模式的六大原则
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,
实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。
里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,
基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。
实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,
所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科
3、依赖倒转原则(Dependence Inversion Principle)
这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,
从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。
所以上文中多次出现:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,
使得系统功能模块相对独立。
6、合成复用法则(Composite Reuse Principle)
原则是尽量使用合成/聚合的方式,而不是使用继承。
三、各种设计模式的概述
(一)工厂方法模式
1.普通工厂模式
建立一个工厂类,对实现了同一接口的一些类进行实例的创建。
2.多个工厂方法模式
是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确
的创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。
(二)抽象工厂模式
创建多个工厂类,这样的话一旦需要增加新的功能,直接可以增加新的工厂类,不需要修改之前
的代码。
(三)单例模式
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,
该对象只有一个实例存在。
1.懒汉式单例
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,
Singleton的唯一实例只能通过getInstance()方法访问。但是以上懒汉式单例的实现没有考虑线程
安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例。
2.饿汉式单例
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
3.登记式单例
实际上维护了一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实
例,则从Map直接返回,对于没有登记的,则先登记,然后返回。这个用得最少。
(四)建造者模式(Builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,
用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。
(五)原型模式(Prototype)
原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将
一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。
(六)适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造
成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
(七)装饰模式(Decorator)
装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一
个接口,装饰对象持有被装饰对象的实例。
(八)代理模式(Proxy)
代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候会去找中介,
为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的
代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可
以替我们进行操作,表达我们的想法
(九)外观模式(Facade)
外观模式是为了解决类与类之家的依赖关系的,可以将类和类之间的关系配置到配置文件中,而外
观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接
口。
(十)桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与
实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数
据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是
JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。
(十一)组合模式(Composite)
组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便
(十二)享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,
通常与工厂模式一起使用。
(十三)策略模式(Strategy)
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影
响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接
口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。
(十四)模板方法模式(Template Method)
模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1…n个方法,可以是抽象的,也可
以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调
用。
(十五)观察者模式(Observer)
观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS
图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一
句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种
一对多的关系。
(十六)迭代子模式(Iterator)
迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话
,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器
对象,用于对聚集对象进行遍历访问。
(十七)责任链模式(Chain of Responsibility)
责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条
链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,
所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。
(十八)命令模式(Command)
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员
的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互
解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关
注到底士兵是怎么实现的。
(十九)备忘录模式(Memento)
主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些
,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存
储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。
(二十)状态模式(State)
当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线、隐身、忙碌
等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1、可
以通过改变状态来获得不同的行为。2、你的好友能同时看到你的变化。
(二十一)访问者模式(Visitor)
访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态
添加新的操作而无需做其它的修改的效果。
(二十二)中介者模式(Mediator)
中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓
展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关
心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行。
(二十三)解释器模式(Interpreter)
解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等。
(二十四)对象池模式(Object pool)
通过回收不再使用的对象来避免昂贵的获取和释放资源。
1 | 以上是看的别人的blog,后面慢慢研究设计模式 |