设计模式之单例模式

什么是单例模式

  • 单例模式(Singleton),简单来说,就是被单例的对象只能有一个实例存在。
  • 单例模式的实现方式
    一个类能返回对象的一个引用(同一个)和一个获得该唯一实例的方法(静态方法)通过单例模式,我们可以保证系统中只有一个实例,从而达到节约或者控制系统资源的目的
  • 举个例子
    1.在现实生活中跟你结婚的女人肯定只有一个,不然你就等着死翘翘了,重婚罪可不小--!
  • 实现单例的几种模式
  1. 饿汉模式
public class MyWife
{
    // singleton
    public MyWife() {}
    private static final MyWife myWife = new MyWife();
    public static MyWife getWife()
    {
        return myWife;
    }
}
  • 饿汉就是不管有没有调用过获得实例的方法,每次都会新建一个实例。
  1. 懒汉模式
public class MyWife
{
    private static MyWife myWife;
    public MyWife (){};
    private static MyWife getWife()
    {
        if (myWife== null)
        {
            myWife= new MyWife ();
        }
        return myWife;
    }
}
  • 懒汉模式 缺点,如果是多个线程调用就会创建多个单例
  1. 懒汉模式线程安全,简单点的直接加同步关键字synchronized
public class MyWife
{
    private static MyWife myWife;
    public MyWife (){};
    private static synchronized MyWife getWife()
    {
        if (wife == null)
        {
            myWife= new MyWife ();
        }
        return myWife;
    }
}
  1. 双重检验锁
public class MyWife 
{
 private volatile static MyWife myWife;

 private MyWife(){ }

 public static MyWife getWife()
 {
     if (myWife == null) 
     {
         synchronized(MyWife.class)
         {
             if (myWife == null) 
             {
                 myWife = new MyWife();
             }
         }
     }
     return myWife;
 }
}
  • 对于双重检验锁并不是太推荐使用,因为volatile 关键字作用是防止编译器自行优化代码 但是volatile 关键字在某些老版本的 JDK 中无法正常工作

5 静态内部类的单例模式

public class MyWife
{
    private static class WifeHodler
    {
        private static final MyWife myWife = new MyWife();
    }
    
    public static MyWife getMyWife()
    {
        return WifeHodler.myWife;
    }
}
  • 这种方式是推荐使用的,首先 WifeHolder 类是私有的,除了 getMyWife() 之外没有其它方式可以访问实例对象,而且只有在调用 getWife() 时才会去真正创建实例对象
  1. 枚举的单例模式
public enum MyWife
{
    INSTANCE;
    // 自定义任意的方法
    public void whateverMethod()
    {
        
    }
}
  • 这种方式使用较好,但是逼格比较高 , 有兴趣可以试试


    设计模式之单例模式_第1张图片
    图片.png

我的博客

你可能感兴趣的:(设计模式之单例模式)