标签: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; } }
- 解决线程安全
- 懒加载实现
- 效率较高
- 可用
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!"); } }
【Java】【设计模式 Design Pattern】单例模式 Singleton
标签:closed 优先 方法 加载 处理 固定 let gif 跳过
原文地址:https://www.cnblogs.com/mindzone/p/12722554.html