一、单例模式
定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
三个要素:私有的构造方法、指向自己实例的私有静态引用、以自己实例为返回值的静态的公有的方法。单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用;而懒汉式在调用取得实例方法的时候才会实例化对象。个人觉得适用于项目里配置信息的获取。节约内存,减少了运行的成本
直接参考:极客学院:单例模式
二、工厂模式
工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、工厂方法模式、以及抽象工厂模式。
主要优点有以下三点:1.可以使代码结构清晰,有效地封装变化。2. 对调用者屏蔽具体的产品类。3.降低耦合度。
迪米特法则在工厂模式中表现的尤为明显,而且项目里如果有大量相同的类似处理类,不防设计工厂模式,而不是代码里大量的if else或者switch
三、建造者模式
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。看了一下介绍,感觉不如项目里直接用public static方法更多,也可以很好的隐藏复杂对象的构建。目前注入式编程里很多使用的是单例模式编程,感觉建造者模式反而不是很适用。
参考:极客学院:建造者模式
四、原型模式
定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
注意事项:1.使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。2.深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。
参考:极客学院:原型模式
五、模版方法模式
定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤
感觉最没啥用的模式
六、中介者模式
定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
参考:极客学院:中介者模式
七、观察者模式
定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。
这个模式一般代码里不会这么用,有点麻烦,作为解耦神器,一般使用 mq做到观察者模式的实现,既解耦又能提高性能。
参考:极客学院:观察者模式
八、访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
访问者模式的优点:1.符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的,所以当发生变化时,就可以在不改变元素类本身的前提下,实现对变化部分的扩展。2.扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。
九、命令模式
定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
十、责任连模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
感觉还没if else好用啊,代码更加复杂了
十一、策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
策略模式的主要优点有:
1.策略类之间可以*切换,由于策略类实现自同一个抽象,所以他们之间可以*切换。2.易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。3.避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的。
策略模式的缺点主要有两个:
1.维护各个策略类会给开发带来额外开销,可能大家在这方面都有经验:一般来说,策略类的数量超过5个,就比较令人头疼了。
2.必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的,因此,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重。
十二、迭代器模式
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
java里各种容器像list map set的迭代器遍历