二十三种设计模式
二十三种设计模式
创建类模式
创造类设计模式:单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式;
单例模式
单例模式分为懒汉模式、饿汉模式;
懒汉模式:没有才进行实例化,多线程下可能存在异常,需加同步锁,线程阻塞;(关键字volatile对静态变量的修饰,则能保证变量值在各线程访问时的同步性、唯一性。);
package com.example.designPatterns.SinglePatterns;
/**
* 懒汉式单例模式
* @描述
*/
public class LazySinglePatterns {
//volatile作用:1. 线程的可见性:当一个线程修改一个共享变量时,另外一个线程能立刻读到这个修改的值。2. 顺序一致性:禁止指令重排序。
private volatile static LazySinglePatterns lazySinglePatterns;
private LazySinglePatterns() {
}
public static LazySinglePatterns getInstance() {
if (lazySinglePatterns == null) {
synchronized (LazySinglePatterns.class) {
if (lazySinglePatterns == null) {
lazySinglePatterns = new LazySinglePatterns();
}
}
}
return lazySinglePatterns;
}
}
饿汉模式:初始化阶段主动实例化,无论是否需要。
package com.example.designPatterns.SinglePatterns;
/**
* 饿汉单例模式
*/
public class HungryManSinglePatterns {
private static HungryManSinglePatterns hungryManSinglePatterns = new HungryManSinglePatterns();
private HungryManSinglePatterns() {
}
public static HungryManSinglePatterns getInstance() {
if (hungryManSinglePatterns == null) {
return new HungryManSinglePatterns();
}
return hungryManSinglePatterns;
}
}
单例模式构造方法设置成私有:保证在一个进程中,某个类有且仅有一个实例,并提供一个全局访问点来获取这个实例。
原型模式(克隆模式)
原型模式需继承Cloneable接口,调用super.clone则可得到新克隆的对象。原型模式有分为深拷
贝、浅拷贝两种; 浅拷贝:被复制对象的变量与原型对象值相同,其他对象的引用仍然指向原来的对象,原型对象与克隆对象的引用不同;深拷贝: 克隆对象的所有变量与原来的对象相同的值。那些引用其他对象的变量将指向被复制过的新对象。
深拷贝
public class PrototypePatterns implements Cloneable {
private Aircraft aircraft = new Aircraft("Demo-1");
public Aircraft getAircraft() {
return aircraft;
}
public void setAircraft(Aircraft aircraft) {
this.aircraft = aircraft;
}
public PrototypePatterns() {
}
@Override
protected PrototypePatterns clone() throws CloneNotSupportedException {
PrototypePatterns prototypePatterns = (PrototypePatterns) super.clone();
prototypePatterns.setDog(this.aircraft.clone());//引用对象也需要实现cloneable接口
return prototypePatterns;
}
}
//结果展示
//com.example.designPatterns.clonePatterns.PrototypePatterns@60e53b93
//com.example.designPatterns.clonePatterns.PrototypePatterns@5e2de80c
//com.example.designPatterns.clonePatterns.Aircraft@1d44bcfa
//com.example.designPatterns.clonePatterns.Aircraft@266474c2
浅拷贝
public class PrototypePatterns implements Cloneable {
private Aircraft aircraft = new Aircraft("Demo-1");
public Aircraft getAircraft() {
return aircraft;
}
public void setAircraft(Aircraft aircraft) {
this.aircraft = aircraft;
}
public PrototypePatterns() {
}
@Override
protected PrototypePatterns clone() throws CloneNotSupportedException {
return (PrototypePatterns) super.clone();
}
}
//结果展示
//com.example.designPatterns.clonePatterns.PrototypePatterns@60e53b93
//com.example.designPatterns.clonePatterns.PrototypePatterns@5e2de80c
//com.example.designPatterns.clonePatterns.Aircraft@1d44bcfa
//com.example.designPatterns.clonePatterns.Aircraft@1d44bcfa
工厂方法模式
工厂方法模式实现接口规范化,以允许子类工厂决定具体制造那类产品的实力,实现降低系统耦合,使系统的扩展性、可维护性等得到提升。
抽象工厂模式
抽象工厂模式:工厂类抽象化;
建造者模式
建造者模式(生产者模式)所构建的对象一定是庞大而复杂的,并且一定是按照既定的制造工序将组件组装起来的。
结构类模式
结构类模式有:门面模式、组合模式、装饰器模式、适配器模式、享元模式、代理模式、桥接模式
门面模式
门面模式(外观模式):客户端-外观门面(封装多个子系统)—子系统
组合模式
组合模式:是针对由多个节点对象(部分)组成的树形结构的对象(整体)而发展出的一种结构型设计模式,它能够使客户端在操作整体对象或者其下的每个节点对象时作出的统一的响应,保证树形结构对象使用方法的一致性,使客户端不必关注对象的整体或部分,最终达到对象复杂的层次结构与客户端解耦的目的。
装饰器模式
装饰器模式:能够在运行时动态地为原始对象增加一些额外的功能,使其变得更加强大。类似于“继承”,它们都是为了增强原始对象的功能,区别在于方式的不同,后者是在编译时(compile-time)静态地通过对原始类的继承完成,而前者则是在程序运行时(run-time)通过对原始对象动态的“包装”完成,是对类实例(对象)“装饰”的结果。
适配器模式
适配器模式:对象适配器模式与类适配器模式基本相同,二者的区别在于前者的Adaptee(被适配者)以接口形式出现并被Adaper(适配器)引用,而后者则是以父类的角色出现并被Adapter(适配器)继承,所以前者更加灵活,后者则更简便。
享元模式
享元模式:系统存在大量的对象,并且这些对象又具有相同的内部状态时,使用享元模式共享相同的文件对象,以避免对象泛滥造成资源浪费
代理模式
代理模式:客户端不能或不适合直接访问目标对象时,业务对象可以通过代理把自己的业务托管起来,使客户端间接地通过代理进行业务访问。如此不但能方便用户使用,还能对客户端的访问进行一定的控制,动态代理模式实现InvocationHandler
桥接模式
桥接模式:桥接模式(Bridge)能将抽象与实现分离,使二者可以各自单独变化而不受对方约束,使用时再将它们组合起来,就像架设桥梁一样连接它们的功能,如此降低了抽象与实现这两个可变维度的耦合度,以保证系统的可扩展性。
行为模式
行为模式:模版、迭代器、责任链、策略、状态、备忘录、中介、命令、访问者、观察者、解释器。
模版模式
模版模式:模版是对多种事物的结构、形式、行为的模式化总结,而模板方法模式(Template Method)则是对一系列类行为(方法)的模式化。
迭代器模式
迭代器模式:迭代器模式(Iterator)提供了一种机制来按顺序访问集合中的各元素,而不需要知道集合内部的构造。迭代器满足了集合迭代的需求,并向外部提供了一种统一的迭代方式,而不必暴露集合的内部数据结构。实现Iterable接口。
责任链模式
责任链模式:责任链是由很多责任节点串联起来的一条任务链条,其中每一个责任节点都是一个业务处理环节。责任链模式(Chain of Responsibility)允许业务请求者将责任链视为一个整体并对其发起请求,而不必关心链条内部具体的业务逻辑与流程走向,也就是说,请求者不必关心具体是哪个节点起了作用,总之业务最终能得到相应的处理。请求者可以直接通过访问业务责任链来完成业务的处理,最终实现请求者与响应者的解耦。
策略模式
策略模式:策略模式(Strategy)强调的是行为的灵活切换,在运行时灵活对接,变更其算法策略,以适应不同的场景。
状态模式
状态模式:构架出一套完备的事物内部状态转换机制,并将内部状态包裹起来且对外部不可见,使其行为能随其状态的改变而改变,同时简化了事物的复杂的状态变化逻辑。
备忘录模式
备忘录模式:备忘录用来记录曾经发生过的事情,使回溯历史变得切实可行。备忘录模式(Memento)则可以在不破坏元对象封装性的前提下捕获其在某些时刻的内部状态,并像历史快照一样将它们保留在元对象之外,以备恢复之用。
中介模式
中介模式:中介模式(Mediator)为对象构架出一个互动平台,通过减少对象间的依赖程度以达到解耦的目的。中介是在事物之间传播信息的中间媒。
命令模式
命令模式:作为一种数据(指令信息)驱动的行为型设计模式,命令模式(Command)能够将指令信息封装成一个对象,并将此对象作为参数发送给接收方式执行,以使命令的请求方与执行方解耦,双方只通过传递各种命令对象来完成任务
访问者模式
访问者模式:主要解决的是数据与算法的耦合问题,尤其是在数据结构比较稳定,而算法多变的情况下,为了不“污染”数据本身,访问者模式会将多种算法独立归类,并在访问数据时根据数据类型自动切换到对象的算法,实现数据的自动相应机制,并且确保算法的自由扩展。
观察者模式
观察者模式:察眼观色、思考分析一直时人类认识客观事物的重要途径。观察行为通常是一种为了对目标状态变化作出及时响应而采取的监控及调查活动。观察者模式(Observer)可以针对被观察对象与观察者对象之间一对多的依赖关系建立起一种行为自动触发机制,当被观察对象状态发生变化时主动对外发起广播,以通知所有观察者做出响应。
解释器模式
解释器模式:解释器模式(Interpreter)会针对某种语言并基于其语言特征创建一系列的表达式类(包括终极表达式与非终极表达式),利用树结构模式将表达式对象组装起来,最终将其翻译成计算机能够识别并执行的语义树。