Java设计模式学习总结

设计模式基础学习总结

这篇总结主要是基于我以前设计模式基础系列文章而造成的的。主要是把重要的知识点用本身的话说了一遍,可能会有一些错误,还望见谅和指点。谢谢程序员

更多详细内容能够查看个人专栏文章:设计模式学习
https://blog.csdn.net/a724888...算法

设计模式

建立型模式

建立型模式
建立型模式的做用就是建立对象,说到建立一个对象,最熟悉的就是 new 一个对象,而后 set 相关属性。可是,在不少场景下,咱们须要给客户端提供更加友好的建立对象的方式,尤为是那种咱们定义了类,可是须要提供给其余开发者用的时候。数据库

单例

单例模式保证全局的单例类只有一个实例,这样的话使用的时候直接获取便可,好比数据库的一个链接,Spring里的bean,均可以是单例的。

单例模式通常有5种写法。

第一种是饿汉模式,先把单例进行实例化,获取的时候经过静态方法直接获取便可。缺点是类加载后就完成了类的实例化,浪费部分空间。

第二种是饱汉模式,先把单例置为null,而后经过静态方法获取单例时再进行实例化,可是可能有多线程同时进行实例化,会出现并发问题。

第三种是逐步改进的方法,一开始能够用synchronized关键字进行同步,可是开销太大,然后改为使用volatile修饰单例,而后经过一次检查判断单例是否已初始化,若是未初始化就使用synchronized代码块,再次检查单例防止在这期间被初始化,然后才真正进行初始化。

第四种是使用静态内部类来实现,静态内部类只在被使用的时候才进行初始化,因此在内部类中进行单例的实例化,只有用到的时候才会运行实例化代码。而后外部类再经过静态方法返回静态内部类的单例便可。

第五种是枚举类,枚举类的底层实现其实也是内部类。枚举类确保每一个类对象在全局是惟一的。因此保证它是单例,这个方法是最简单的。

工厂模式

简单工厂通常是用一个工厂建立多个类的实例。

工厂模式通常是指一个工厂服务一个接口,为这个接口的实现类进行实例化

抽象工厂模式是指一个工厂服务于一个产品族,一个产品族可能包含多个接口,接口又会包含多个实现类,经过一个工厂就能够把这些绑定在一块儿,很是方便。

原型模式

通常经过一个实例进行克隆从而得到更多同一原型的实例。使用实例的clone方法便可完成。

建造者模式

建造者模式中有一个概念叫作链式调用,链式调用为一个类的实例化提供便利,通常提供系列的方法进行实例化,实际上就是将set方法改造一下,将本来返回为空的set方法改成返回this实例,从而实现链式调用。

建造者模式在此基础上加入了builder方法,提供给外部进行调用,一样使用链式调用来完成参数注入。

结构型模式

结构型模式
前面建立型模式介绍了建立对象的一些设计模式,这节介绍的结构型模式旨在经过改变代码结构来达到解耦的目的,使得咱们的代码容易维护和扩展。编程

桥接模式

有点复杂。建议参考原文设计模式

适配器模式

适配器模式用于将两个不一样的类进行适配。微信

适配器模式和代理模式的异同网络

比较这两种模式,实际上是比较对象适配器模式和代理模式,在代码结构上,
它们很类似,都须要一个具体的实现类的实例。
可是它们的目的不同,代理模式作的是加强原方法的活;
适配器作的是适配的活,为的是提供“把鸡包装成鸭,而后当作鸭来使用”,
而鸡和鸭它们之间本来没有继承关系。多线程

适配器模式能够分为类适配器,对象适配器等。并发

类适配器经过继承父类就能够把本身适配成父类了。
而对象适配器则须要把对象传入另外一个对象的构造方法中,以便进行包装。框架

享元模式

/ 享元模式的核心在于享元工厂类,
// 享元工厂类的做用在于提供一个用于存储享元对象的享元池,
// 用户须要对象时,首先从享元池中获取,
// 若是享元池中不存在,则建立一个新的享元对象返回给用户,
// 在享元池中保存该新增对象。

//享元模式
// 英文是 Flyweight Pattern,不知道是谁最早翻译的这个词,感受这翻译真的很差理解,咱们试着强行关联起来吧。Flyweight 是轻量级的意思,享元分开来讲就是 共享 元器件,也就是复用已经生成的对象,这种作法固然也就是轻量级的了。
//
// 复用对象最简单的方式是,用一个 HashMap 来存放每次新生成的对象。每次须要一个对象的时候,先到 HashMap 中看看有没有,若是没有,再生成新的对象,而后将这个对象放入 HashMap 中。
//
// 这种简单的代码我就不演示了。

代理模式

// 咱们发现没有,代理模式说白了就是作 “方法包装” 或作 “方法加强”。
// 在面向切面编程中,算了仍是不要吹捧这个名词了,在 AOP 中,
// 其实就是动态代理的过程。好比 Spring 中,
// 咱们本身不定义代理类,可是 Spring 会帮咱们动态来定义代理,
// 而后把咱们定义在 @Before、@After、@Around 中的代码逻辑动态添加到代理中。

外观模式

外观模式通常封装具体的实现细节,为用户提供一个更加简单的接口。

经过一个方法调用就能够获取须要的内容。

组合模式

//组合模式用于表示具备层次结构的数据,使得咱们对单个对象和组合对象的访问具备一致性。

//直接看一个例子吧,每一个员工都有姓名、部门、薪水这些属性,
// 同时还有下属员工集合(虽然可能集合为空),
// 而下属员工和本身的结构是同样的,
// 也有姓名、部门这些属性,
// 同时也有他们的下属员工集合。

class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates; // 下属
}

装饰者模式

装饰者

装饰者模式把每一个加强类都继承最高级父类。而后须要功能加强时把类实例传入加强类便可,而后加强类在使用时就能够加强原有类的功能了。

和代理模式不一样的是,装饰者模式每一个装饰类都继承父类,而且能够进行多级封装。

行为型模式

行为型模式
行为型模式关注的是各个类之间的相互做用,将职责划分清楚,使得咱们的代码更加地清晰。

策略模式

策略模式通常把一个策略做为一个类,而且在须要指定策略的时候传入实例,因而咱们能够在须要使用算法的地方传入指定算法。

命令模式

命令模式通常分为命令发起者,命令以及命令接受者三个角色。

命令发起者在使用时须要注入命令实例。而后执行命令调用。

命令调用实际上会调用命令接收者的方法进行实际调用。

好比遥控器按钮至关于一条命令,点击按钮时命令运行,自动调用电视机提供的方法便可。

模板方法模式

模板方法通常指提供了一个方法模板,而且其中有部分实现类和部分抽象类,而且规定了执行顺序。

实现类是模板提供好的方法。而抽象类则须要用户自行实现。

模板方法规定了一个模板中方法的执行顺序,很是适合一些开发框架,因而模板方法也普遍运用在开源框架中。

状态模式

少见。

观察者模式和事件监听机制

观察者模式通常用于订阅者和消息发布者之间的数据订阅。

通常分为观察者和主题,观察者订阅主题,把实例注册到主题维护的观察者列表上。

而主题更新数据时自动把数据推给观察者或者通知观察者数据已经更新。

可是因为这样的方式消息推送耦合关系比较紧。而且很难在不打开数据的状况下知道数据类型是什么。

知道后来为了使数据格式更加灵活,使用了事件和事件监听器的模式,事件包装的事件类型和事件数据,从主题和观察者中解耦。

主题当事件发生时,触发该事件的全部监听器,把该事件经过监听器列表发给每一个监听器,监听获得事件之后,首先根据本身支持处理的事件类型中找到对应的事件处理器,再用处理器处理对应事件。

责任链模式

责任链一般须要先创建一个单向链表,而后调用方只须要调用头部节点就能够了,后面会自动流转下去。好比流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动创建一条责任链,而后就能够开始流转了。

更多内容请关注微信公众号【Java技术江湖】

这是一位阿里 Java 工程师的技术小站,做者黄小斜,专一 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”资料“便可领取 3T 免费技术学习资源以及我我原创的程序员校招指南、Java学习指南等资源)

相关文章
相关标签/搜索