设计模式
创建者模式:
-
工厂模式:在工厂类中通过工厂的方法直接获得对象,一般来说静态方法最好,可以直接调用。
-
抽象工厂模式:通过超级工厂建立其他工厂,然后在通过工厂模式创建对象。
-
单例模式:确保只有一个对象被创建。构造函数private。静态创建只一次。
- 懒汉式,线程不安全。调用函数时才创建对象。
- 懒汉式,线程安全。在调用的函数或者内部采用synchronized修饰。加锁,效率低。
- 饿汉式,线程安全,类加载时就初始化,调用函数返回。浪费内存
- 双检锁(1.5后):
- 登记式/静态内部类:
- 枚举(1.5后)
使用场景:Web计数器。
-
建造者模式:多个简单的对象一步一步构建成一个复杂的对象。与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。复杂的对象由多个对象组合而成。
-
原型模式:用于创建重复的对象,保证性能,是我们要复制的对象实现Cloneable接口,在其中写入clone()方法。方法中调用返回super.clone()。其中object中的clone是一个native,应该是底层用c或者c++实现的,不讨论
protected native Object clone() throws CloneNotSupportedException;
class test implements Cloneable{
public String name=“godv”;
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
注意深度克隆和浅度克隆。
如果我们克隆的对象存在其他的引用类型(数组,其他的对象等):我们将引用类型也克隆,就是深度克隆。对于引用类型两个克隆对象指向同一个对象,就是浅度克隆。
结构型模式:
-
适配器模式:作为两个不兼容的接口之间的桥梁,结合了两个独立接口的功能。读卡器是作为内存卡和笔记本之间的适配器,使用继承或依赖(推荐)的手段,适配器继承或依赖已有的对象,实现想要的目标接口。
将我们想拓展的功能的部分和以前部分重新整合到一个适配器中。 -
桥接模式:把抽象化与实现化解耦,使得二者可以独立变化,然后组合,通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。聚合依赖 增强拓展性 。
-
组合模式:,构造一个通用的组合对象。通过递归的手段来构造树形对象结构,通过一个对象来访问整个树。例如:文件系统树形菜单。表现出部分-整体的层次结构。
-
装饰器模式:向一个现有的对象添加新的功能,同时又不改变其结构。创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
继承的方法可以实现和增加一个中间的抽象装配类,在其中动态添加功能。 -
外观模式:)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
就是创建一个外观类。其中包含了很多的功能对象。通过外观类来调用而不是在外部创建对象调用。 -
享元模式:减少创建对象的数量,以减少内存占用和提高性能。提供了减少对象数量从而改善应用所需的对象结构的方式。像当于我们把对象保存起来,创建之前先在缓冲区找,没有再创建,适用于对象复用情况较多的时候。 字符串缓冲池,数据库连接池
-
代理模式:一个类代表另一个类的功能,创建具有现有对象的对象,以便向外界提供功能接口 。例如: spring aop。 Windows 里面的快捷方式,。 通过代理对象访问真实对象,动态代理是什么?
行为型模式
多数情况都是运用继承或者实现的多态性,封装一个抽象类来多态的调用。 -
责任链模式:请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
例如:servlet 的 Filter。 JAVA WEB 中 Apache Tomcat 对 Encoding 的处理。 -
命令模式:数据驱动的设计模式,请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。封装一个commend对象来调用,不直接调用,还可以添加其他的功能。相当于多一个中间层(多一个服务员一样的)。
-
解释器模式:建立一个语法解释器。用来解释预先定义的文法,提供了评估语言的语法或表达式的方式,这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
-
迭代器模式:这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。按照自己编订的规则访问下去。例如:JAVA 中的 iterator。
-
中介者模式:用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
实例:MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。 -
备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象。
实例:数据库的事务管理,浏览器后退,。 -
观察者模式:(查看api中obsever和observable)当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。保持状态同步。、
被观察者继承observable类。表示自己被观察。在对象被修改时,调用notifyObservers()通知其所有的观察者。需要通过addobserver()函数注册是一个被观察者。并且在改变时调用setchanged()告诉贯彻这个自己已经改变了。
观察者实现Obsever接口,重写update方法,在被观察者的notifyObservers()方法被调用之后自动调用。保持状态同步。
-
状态模式:类的行为是基于它的状态改变的,创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。通过设置多个状态来表示类的行为。本质就是类接收一个状态信息,一个状态信息对应一个类的行为。
-
策略模式:一个类的行为或其算法可以在运行时更改。创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
用来平滑的处理算法的切换。
Ps: 状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。
状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法
-
访问者模式(最难):使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。不同的访问者有不同的操作。
-
模板方法模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。把一些特定的步骤算法中的某些必要的处理委让给抽象方法。通过子类继承抽象方法的不同来改变整个算法的行为。
例如:开启资源,关闭资源、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。就是把一样的步骤交给抽象方法,直接丢一个个不同的对象就可以。