个人理解
工作几年了,对设计模式的理解还是只停留在课本上的知识而已,大大小小经历了3-4家公司了,每家公司的面试题都少不了提一句设计模式,然而真正的工作中却很少有人使用,主要是存在以下两种原因:
1、为什么使用设计模式
2、使用了设计模式别人阅读代码起来不方便
先回答第一个问题,设计模式可以拆成两个词来分析设计+模式,模式是指大多数人认可的一套对问题的处理解决方案,设计顾名思义,然而为什么要使用设计模式呢?对于java来说是一套面向对象的编程语言,然而设计模式就是用来声明对象与对象之间的关系的方式;
第二个问题使用了设计模式会使代码的可读性变差,其实不是这样的,合理的使用设计模式会让代码的可读性变得更好,也会增强代码的可扩展性,还记得java的3大特性吗?封装继承多态,设计模式就是将这三种特性发挥的淋漓尽致的方法;
当然了,说了这么多设计模式的好处,其实也不是所有的代码都适合使用设计模式的,想要合理的运用设计模式也是不容易的,对于业务及其简单的增删改查无需考虑扩展的业务来说就没必要使用设计模式了,现在很多小公司的一些系统就是这样的业务模式,如果你工作已经3年多了还是觉得设计模式没什么用,那你想想自己是不是做了3年的增删改查,想要灵活的运用设计模式还需要开发人员对业务方向具有一定的前瞻性,时不时的跟需求方搞好关系,平时闲聊的时候留点心。
工厂模式
1、简单工厂模式
构建模式的基础,采用一个工厂类中的一个方法来生成所需要的实体
2、工厂方法模式
简单工厂模式的改版,说白了就是在一个工厂类里添加多个方法,分别用于生成不同的实体,这貌似违反了开闭原则,若要添加一个实体,就要新增一个方法
3、抽象工厂模式
由于工厂方法模式违背了开闭原则,所以需要另一种模式来代替,所以就出现了抽象工厂模式,一个工厂类中存在一个共同的抽象方法用于声明生产,由多个工厂类去实现具体的实现机制,生成不同的实体。
策略模式
与工厂模式类似,有时候与工厂模式一起出现,与工厂模式不同的是策略模式属于行为模式,一个接口多个实现类,根据不同的业务使用不同的实现类,而选择不同的实现类的时候,很多时候会用到工厂模式
代理模式
代理模式顾名思义,就是在一个实现类中的某些方法由另一个实现类的同一个方法去实现
装饰者模式
装饰者模式和代理模式很像很多人都难以区分,装饰者模式比代理模式更加灵活一些,装饰者模式是有权在另一个实现类中的运行结果前后添加自己所需要的代码的,而代理模式则全权的让代理类去实现
适配器模式
适配器模式在最初的学习中我并没用真正的使用过,直到一次需求中,我用最初的策略模式是发现了,很多实现类之中没必要实现一些方法,最后导致的是那些方法都是空方法阅读起来很别扭,这时候我就觉得应该有一种设计模式能解决这种问题,后来我在看java.io.InputStream的源码的时候发现了适配器模式的优点,其实就是在实现类与接口中间添加一个类
单例模式
单例模式估计我们每天都在用,因为spring的默认bean的生成方式就是单例,这样可以减少jvm中的堆的内存实例,不要小看这一点,在并发高的服务其中如果不使用单例的实体,服务器堆内存会很快的溢出的;单例模式主流的分成两中,懒汉式和饿汉式,饿汉式是在class加载时就生成实体,然后每次访问都返回相同内存地址的实体;懒汉式是在第一次访问的时候生成这个实体,这就不得不考虑并发的问题了