设计模式--单例模式_线程安全

设计模式是软件工程中共同的问题的解决方案,这些方案经过了验证和总结,能够在不同的情境中提供最佳的解决途径。设计模式主要分为三类:创建型模式、结构型模式和行为型模式。以下是这三类模式中的 23 个经典设计模式的列表:

创建型模式(Creational Patterns):

创建型模式涉及对象的初始化和创建过程,它可以使得系统在不需要指定精确类的情况下创建对象。

  1. 单例(Singleton)
  2. 原型(Prototype)
  3. 工厂方法(Factory Method)
  4. 抽象工厂(Abstract Factory)
  5. 建造者(Builder)

结构型模式(Structural Patterns):

结构型模式关注如何组合类和对象以获得更大的结构。

  1. 装饰器(Decorator)
  2. 适配器(Adapter)
  3. 桥接(Bridge)
  4. 组合(Composite)
  5. 外观(Facade)
  6. 享元(Flyweight)
  7. 代理(Proxy)

行为型模式(Behavioral Patterns):

行为型模式关注对象之间的职责分配。它们描述了对象之间的通信及其之间关系。

  1. 责任链(Chain of Responsibility)
  2. 命令(Command)
  3. 解释器(Interpreter)
  4. 迭代器(Iterator)
  5. 中介者(Mediator)
  6. 备忘录(Memento)
  7. 观察者(Observer)
  8. 状态(State)
  9. 策略(Strategy)
  10. 模板方法(Template Method)
  11. 访问者(Visitor)

这些模式是编程经验的晶体,能够帮助程序员避免重复 "重新发明轮子",而是利用已有的设计模式来解决常见问题。了解和掌握这些设计模式可以使设计更加清晰、代码更容易维护和扩展。

单例模式

单例模式分为懒汉模式和饿汉模式;

饿汉:该模式在类被加载时就会实例化一个对象。

该模式能简单快速的创建一个单例对象,而且是线程安全的(只在类加载时才会初始化,以后都不会)。但是它有一个缺点,就是不管你要不要都会直接创建一个对象,会消耗一定的性能(性能几乎可以忽略不计,所有这种模式在很多场合十分常用而且十分简单)。

懒汉:该模式只在你需要对象时才会生成单例模式(比如调用getInstance方法)

单例模式∶使用静态函数,获得对象

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

单例模式的实现

  1. 懒汉式∶ 线程不安全,需要双重加锁(重要) 不使用的时候不占用内存,不是线程安全的 在类加载时不初始化,等待第一次被调用才初始化
  2. 饿汉式∶

    线程安全

    内部唯一的对象是在程序刚运行时进行初始化的。

    可以保证线程安全,缺点是即使不使用也会进行初始化,浪费资源

懒汉模式:懒汉模式指的是单例实例在需要时才被创建。这种模式的关键在于延迟加载,即直到第一次调用 getInstance() 方法时才创建实例。在多线程环境下需要特别小心对实例化过程中的并发访问进行处理,通常需要同步处理。

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}  // 私有构造函数

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();  // 实例在这里创建
        }
        return instance;
    }
}

饿汉模式:相对于懒汉模式,饿汉模式在类加载时就立即创建该类的单例实例。由于类加载在程序开始时就完成了,因此不需要担心多线程问题。这是一个简单且线程安全的实现方式。

public class EagerSingleton {
    // 直接初始化一个实例
    private static final EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}  // 私有构造函数

    public static EagerSingleton getInstance() {
        return instance; // 直接返回实例
    }
}