关于后端:设计模式-单例模式

5次阅读

共计 2038 个字符,预计需要花费 6 分钟才能阅读完成。

设计模式概述

设计模式是一套被重复应用,少数人通晓的,通过分类编目标代码设计教训的总结。它形容了在软件设计过程中的一些一直反复产生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计教训的总结,具备肯定的普遍性,能够重复应用。其目标是为了进步代码的可重用性,可读性和可靠性

设计模式的六大设计准则

  1. 开闭准则
    核心思想: 对扩大凋谢,对批改敞开
    也就是说,对曾经应用的类的改变是通过减少代码进行的,而不是通过批改原有代码
  2. 繁多职责准则
    能够了解为高内聚,低耦合;也就是说每个类应该只有一个职责,对外只提供一种性能,而引起类变动的起因应该只有一个
  3. 里氏替换准则
    核心思想: 在任何父类呈现的中央都能够应用其子类来代替
    任何呈现父类或者接口的中央,都能够应用子类的实现去代替。也就是说,同一个继承体系中的对象应该有独特的行为特色
  4. 依赖倒转准则
    核心思想: 要依赖于接口和抽象类,不要依赖于具体的实现
    在应用程序中,所有的类如果应用或者依赖于其余的类,则应该依赖于这些类的抽象类或者接口,而不是间接依赖这些类的实现类
  5. 接口拆散准则
    核心思想: 程序不应该依赖它们不须要应用的办法
    一个接口中不须要提供太多的行为,一个接口应该只提供一种对外的性能,不应该将所有的操作都封装到一个接口中
  6. 迪米特准则 (起码认知准则)
    核心思想: 一个对象该当对其余的对象尽可能少的了解
    用于升高各个对象之间的耦合,进步零碎的可维护性

设计模式的三种类型

  1. 创立型模式
    创立型模式包含单例模式,工厂办法模式,形象工厂模式,建造者模式,原型模式
  2. 结构型模式
    结构型模式包含代理模式,适配器模式,装璜模式,亨元模式,外观模式,桥接模式,组合模式
  3. 行为型模式
    行为型模式包含模版办法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

对于设计模式的一些基本概念就介绍到这里,上面进入本节的正题 – 单例模式

单例设计模式

单例设计模式是一种罕用的设计模式。在 Java 利用中,单例对象可能保障在一个 JVM 中,该对象的只有一个实例存在。所以单例类会具备以下的特点
1. 单例类只有一个实例对象
2. 实例对象由单例类自行提供
3. 单例类对外提供一个拜访该单例的全局拜访点
由此能够推断出单例类的形成: 结构器私有化,提供动态的办法供内部获取单例类的对象

单例模式的分类

单例模式有两种写法,懒汉式和饿汉式,饿汉式单例的写法很简略,间接创建对象即可
public class Singleton {
    // 结构公有
    private Singleton(){}
    
    private static Singleton singleton = new Singleton();
    
    // 提供静态方法供内部获取实例
    public Singleton getSingleton(){return singleton;}
}

懒汉式单例是在须要应用时才会创立实例,懒汉式单例有以下几种写法
写法一:
public class Singleton {
    // 结构公有
    private Singleton(){}
    
    private static Singleton singleton = null;
    
    // 提供静态方法供内部获取实例
    public static Singleton getSingleton(){if (singleton == null){singleton = new Singleton();
        }
        return singleton;
    }
}

在写法一的代码中,程序处于低并发时,可能不会呈现问题,然而在高并发的状况下,内存中可能会呈现多个实例,这样就违反了单例模式的准则,解决线程平安问题的办法有多种,最为简略的一种就是间接在获取实例的办法上加上 synchronized 关键字,然而间接锁办法会影响程序的效率,这里提供一种双重检测的写法
写法二:
public class Singleton {
    // 结构公有
    private Singleton(){}
    
    private volatile static Singleton singleton = null;
    
    public static Singleton getSingleton(){if (singleton == null){synchronized (Singleton.class){if (singleton == null){singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

除了写法二,这里再提供一种线程平安的懒汉式单例写法
public class Singleton {
    // 结构公有
    private Singleton(){}
    
    // 此处应用一个外部类来保护单例
    private static class SingletonFactory{private static Singleton singleton = new Singleton();
    }
    
    public static Singleton getSingleton(){return SingletonFactory.singleton;}
}
正文完
 0