【设计模式】之单例模式

一:设计模式的分类

  1. 创建型(creational,主要用于处理对象的创建,实例化对象):单例,简单工厂,工厂,抽象工厂,建造者,原型
  2. 结构型(structural,处理类或对象间的组合):适配器,桥接,装饰,组合,外观,享元,代理
  3. 行为型(behavioral,描述类或对象怎样进行交互和职责分配):模板方法,命令,迭代器,观察者,中介,备忘录,解释器,状态,策略,职责链,访问者

二:单例模式

定义

确保一个类只有一个实例,并提供一个全局访问点

解读

定义中有两点需要注意

  1. 一个实例
    既然说是单例模式,那么定义中这句话起到了点题的作用,在整个服务中,实现了单例模式的类,只能有一个实例,全局都访问这同一个实例。
  2. 一个全局访问点
    如何保证全局只出现该类的一个实例呢,就是保证入口,所有的请求,都通过同一个访问点来获取这个实例。

从单例模式来看,它体现了面向对象的哪些特点呢?

  1. 首先是单一职责,一个类,就只做了一件事,就是保证自己全局只有一个对象。
  2. 依赖倒置,所有使用该类的方法,都不用关心”是否已经创建“,”是否还需要判空“等问题,直接拿来就可以用,实例化的事情交给单例类自己解决。
  3. 抽象,只有将

注意事项

单例模式其实做了两件事,第一件事,保证自己不能被随意实例化,是通过将构造函数声明成私有的来实现的。第二件事,让其他类可以访问到自己的唯一一个实例,是通过静态方法和静态变量来实现的。

结构图

【设计模式】之单例模式_第1张图片

实现

从保证安全性和考虑多线程的情况下,单例模式有3种实现方式,分别是

懒汉式

public class ChocolateBuiler3 {
    private volatile static ChocolateBuiler3 chocolateBoiler;

    private ChocolateBuiler3(){}

    public  ChocolateBuiler3 getInstence(){
        if (Objects.isNull(chocolateBoiler)){
            synchronized (ChocolateBuiler3.class){
                if (Objects.isNull(chocolateBoiler)){
                    return new ChocolateBuiler3();
                }
            }
        }
        return chocolateBoiler;
    }
}

饿汉式

public class ChocolateBuiler1 {
    private static ChocolateBuiler1 chocolateBoiler1=new ChocolateBuiler1();

    private ChocolateBuiler1(){}

    public ChocolateBuiler1 getInstence(){
        return chocolateBoiler1;
    }
}

内部类

public class ChocolateBoiler4 {


    private ChocolateBoiler4(){}

    private static class InnerClass{
        private static ChocolateBoiler4 chocolateBoiler=new ChocolateBoiler4();
    }

    public static ChocolateBoiler4 getInstence(){
        return InnerClass.chocolateBoiler;
    }

}

你可能感兴趣的:(框架)