设计模式之创建者模式中的单例模式、工厂方法模式、抽象工厂模式 主要概要梳理以及各模式优缺点总结

  • 单例模式:
    • 单例设计模式分类两种:

饿汉式:类加载就会导致该单实例对象被创建

懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建

  • 单例模式的三种推荐实现方式:
    • 双重检查锁方式(懒汉式)
    • 静态内部类方式(懒汉式)
    • 枚举方式(饿汉式)

(还有其他的实现方式,但都有线程安全问题或内存浪费问题,所以推荐使用以上三个)

*以上的所有单例实现方式都存在被破坏的可能性【枚举方式除外,因为枚举方式JVM底层已经解决这个问题】

  • 破坏单例模式的两种方式:
    • 序列化和反序列化
    • 暴力反射

  • 解决两类破坏的应对方式:
    • 序列化反序列方式破坏单例模式的解决方法
      • 在Singleton类中添加readResolve()方法,在反序列化时被反射自动调用,如果定义了这个方法,就返回这个方法的值,如果没有定义,则返回新new出来的对象。
    • 反射方式破解单例的解决方法
      • 抛异常

=================================================================

  • 工厂模式
    • 简单工厂模式
      • 并不属于23种设计模式中的一种,更多的是一种编程的习惯在
      • 优点:
        • 封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
      • 缺点:
        • 增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。

  • 工厂方法模式
    • 优点:
      • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
      • 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
    • 缺点:
      • 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,可能会产生类爆炸。

 

  • 抽象工厂模式
    • 优点:
      • 相比于工厂方法模式,抽象工厂模式对类进行同一级别和同一产品族的归纳,向上抽取共同点进行抽象类实现,减少类爆炸的可能性
      • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    • 缺点:
      • 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

  • 模式扩展
    • 优点:
      • 模式扩展就是简单工厂+配置文件实现解耦合
    • 缺点:
      • 需要在代码中进行读配置文件的操作。
      • 也不算缺点,就是写代码的时候更麻烦了,但是使用的时候比较方便,完全实现了类于类之间的解耦合