码迷,mamicode.com
首页 > 编程语言 > 详细

【Java】【设计模式 Design Pattern】单例模式 Singleton

时间:2020-04-17 22:04:13      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:closed   优先   方法   加载   处理   固定   let   gif   跳过   

什么是设计模式?

设计模式是在大量的实践中总结和理论化之后的最佳的类设计结构,编程风格,和解决问题的方式

设计模式已经帮助我们想好了所有可能的设计问题,总结在这些各种各样的设计模式当中,也成为GOF23

恕我直言,设计模式是OOP的精华总结

 

七大原则:

并不是一定要完全遵守这7大原则,耦合一定存在,只能说在一定情况降低到最小就行

 

- 单一职责

- 接口隔离

- 依赖倒转  反转控制 IOC

- 里氏替换

- 开闭原则

- 迪米特法则

- 合成服用

 

什么是单例模式?

顾名思义,一个类只存在唯一的一个实例

设计模式有8种写法

 

饿汉式第一种:

- 写法简单、类加载时,完成了实例化,避免多线程同步问题

- 不能懒加载,如果一直没有使用过这个实例,就造成了内存占用的浪费,懒加载,就是说等我需要使用这个实例时,再执行初始化加载出来调用

- 可用,但是会浪费内存

- 饿汉本身已经非常形容这个静态加载的意思了,不过有没有使用这个实例,先吃了内存空间再说

技术图片
public class Singleton01 {
    
    // 私有构造器
    private Singleton01 (){}
    
    // 静态固定实例
    private static final Singleton01 single = new Singleton01();

    // 提供公开的提供实例方法即可
    public static Singleton01 getInstance() {
        return single;
    }
}
简单饿汉

 

饿汉式第二种:

初始化过程放在了静态代码块,比上面更优先加载出来,其他一样

- 可用

技术图片
public class Singleton01 {

    // 私有构造器
    private Singleton01 (){}
    
    // 声明单例实例
    private static Singleton01 instance;

    // 交给静态块加载
    static { instance = new Singleton01(); }

    // 一样的获取方法
    public static Singleton01 getInstance(){ return instance; }
}
饿汉二

 

懒汉式第一种

- 实现了懒加载行为,但是线程不安全,只能单线程

- 多线程如果没有进入if语句判断就会直接new新实例产生

- 禁止使用

技术图片
public class Singleton {

   private Singleton (){}
   
   private static Singleton instance;
   
   // 如果instance为空 就new出来,反之直接返回
   public static Singleton getInstance(){
      if (instance == null) instance = new Singleton();
      return instance;
   }
}
懒汉一

 

懒汉式第二种

- 解决线程不安全的问题

- 效率太低,每次获取实例都需要执行同步

- 能用,不推荐使用

技术图片
public class Singleton {

   private Singleton (){}
   
   private static Singleton instance;
   
   // 给方法加锁,同步处理化
   public static synchronized Singleton getInstance(){
      if (instance == null) instance = new Singleton();
      return instance;
   }
}
懒汉式二

 

懒汉式第三种

- 代码复杂,线程反而不安全

- 禁用

技术图片
public class Singleton {

   private Singleton (){}
   
   private static Singleton instance;
   
   // 经过判断后枷锁实例,多线程直接跳过判断获取,还是会创建实例
   public static Singleton getInstance(){
      if (instance == null) synchronized (Singleton.class) { instance = new Singleton();}
      return instance;
   }
}
View Code

 

懒汉式第四种双重检查

- 解决线程安全

- 懒加载实现

- 效率较高

- 可用

技术图片
public class Singleton {

   private Singleton (){}
   
   // 设置可见
   private static volatile Singleton instance;
   
   // 二次检查
   public static Singleton getInstance(){
      if (instance == null) synchronized (Singleton.class) {
         if (instance == null) instance = new Singleton();
      }
      return instance;
   }
}
懒汉三双重检查

 

静态内部类实例

- 采用类加载的机制实现懒加载,同时避免了线程安全的问题

- 在调用方法时才会加载内部类返回实例

- 推荐

技术图片
public class Singleton {

   private Singleton (){}
   
   // 静态内部类不会重复加载,其静态属性也如此
   private static final class SingleInstanceClass{
      private static final Singleton INSTANCE = new Singleton();
   }
   
   // 返回内部类的属性实例即可
   public static Singleton getInstance(){
      return SingleInstanceClass.INSTANCE;
   }
}
静态内部类

 

枚举,永远的神

- JDK1.5特性

- 线程绝对安全、实现单例

- 不能被序列化重新创建

- 推荐

技术图片
public enum Singleton{
   INSTANCE;
   
   public void ok(){
      System.out.println("ok!");
   }
}
Enum

 

Runtime经典的饿汉式

技术图片

 

【Java】【设计模式 Design Pattern】单例模式 Singleton

标签:closed   优先   方法   加载   处理   固定   let   gif   跳过   

原文地址:https://www.cnblogs.com/mindzone/p/12722554.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!