Java设计模式-创建型设计模式-单例模式

Java设计模式-创建型设计模式-单例模式

从这一专栏开始将学习设计模式,上课学习和自己总结归纳的笔记将总结出来供大家参考。
参考书籍:《设计模式就该这样学》

其他文章:

Java设计模式-UML类图 Java设计模式-七大架构设计原则-开闭原则
Java设计模式-七大架构设计原则-依赖倒置原则 Java设计模式-七大架构设计原则-单一职责原则
Java设计模式-七大架构设计原则-接口隔离原则 Java设计模式-七大架构设计原则-最少知道原则(迪米特法则)
Java设计模式-七大架构设计原则-里氏替换原则和合成复用原则 Java设计模式-创建型设计模式-简单工厂模式
Java设计模式-创建型设计模式-工厂方法模式(工厂模式) Java设计模式-创建型设计模式-抽象工厂模式
Java设计模式-创建型设计模式-建造者模式 Java设计模式-创建型设计模式-原型模式
Java设计模式-创建型设计模式-单例模式 Java设计模式-结构型设计模式-适配器模式
Java设计模式- 结构型设计模式-享元模式 Java设计模式- 结构型设计模式-外观模式
Java设计模式- 结构型设计模式-桥接模式 Java设计模式-结构型模式设计模式-组合模式
Java设计模式-行为型设计模式-观察者模式

文章目录

  • Java设计模式-创建型设计模式-单例模式
    • 一、创建型设计模式
    • 二、单例模式
      • 1.单例模式定义
          • 单例设计模式主要解决的是类的频繁创建与销毁问题,通过控制类实例的创建来节省系统资源。
      • 2.单例模式的代码实现

一、创建型设计模式

创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对客户端代码需要调用对象的时候隐藏了类的实例化的创建细节

其中包括:简单工厂模式(不在GoF23种设计模式中)、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式

二、单例模式

1.单例模式定义

1.单例模式(Singleton Pattern):确保某一个类最多只有一个实例,并向整个系统提供这个实例,即该类需提供一个访问唯一实例的全局方法,这个类称为单例类。单例模式的目的是使得某个类最多只有一个实例。

2.为了确保单例类最多只有一个实例,且能够向外部提供唯一实例,单例类应具备以下特点特征:

(1)构造方法私有化;

(2)能够生成唯一实例;

(3)存在能够向外部提供唯一实例的方法;

(4)实例和方法需用static关键词修饰。

3.单例模式确保了系统中只能存在唯一实例,则在内存里只有一个实例,这样在频繁的创建和销毁实例时可以减少内存的开销。但由于单例类只向外部提供了访问实例的方法、没有接口,无法被重用和扩展。

4.在GoF23种设计模式中属于创建型设计模式:

​ 其中包括:简单工厂模式(不在GoF23种设计模式中)、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式

单例设计模式主要解决的是类的频繁创建与销毁问题,通过控制类实例的创建来节省系统资源。

2.单例模式的代码实现

怎么写饿汉式?

public class Singleton1{

    private static Singleton1 singleton1 =new Singleton1();

    private Singleton1() {
        //避免通过反射来创建对象
       if(singleton1!=null){
           throw new RuntimeException("单例对象不能重复创建");
       }
            
    }

    public static Singleton1 getInstance() {
        return singleton1;
    }
}

怎么写懒汉式?

双检锁/双重校验锁(DCL,即 Double-Checked-Locking)

public class Singleton2  {
    //加上了volatile后,多线程访问下会给加上volatile变量赋值语句之后加上一个内存屏障
    //让JVM禁止内存重排,保证构造方法赋值操作不能在static对象之后 越过这个内存屏障
    private static volatile Singleton2 singleton2 = null;

    private Singleton2() {

    }
    public static Singleton2 getInstance() {
        //当对象创建出来以后,只需要判断对象是否有值,如果有了就直接返回不需要进入了
        if (singleton2 == null) {
            synchronized (Singleton2.class) {
                //如果没有这个判断,两个线程都会创建对象,并且后进来的线程创建的对象会覆盖掉前面的对象
                if (singleton2 == null) {
                    singleton2 = new Singleton2();
                }
            }
        }
        return singleton2;
    }
}

jdk中的单例模式有哪些?

Runtime类,比如说我们调用System里面的exit() ,调用的就是Runtime类中的exit()

你可能感兴趣的:(Java设计模式,java,架构,设计模式,单例模式)