设计模式系列—单例设计模式
文章插图
本文作者:何建辉(公众号:org_yijiaoqian)
前言
- 23种设计模式速记
文章插图
模式定义保证一个类只有一个实例 , 并且提供一个全局访问点 。
场景说明重量级的对象 , 不需要多个实例 , 如线程池 , 数据库连接池 。
文章插图
单例模式有八种
- 饿汉式(静态常量)
- 饿汉式(静态代码块)
- 懒汉式(线程不安全)
- 懒汉式(线程安全 , 同步方法)
- 懒汉式(线程安全 , 同步代码块)
- 双重检查(DCL)
- 静态内部类
- 枚举
- 构造器私有化(防止 new)
- 类的内部创建对象
- 只向外部暴露一个静态的公共方法(getInstance)
package com.niuh.designpattern.singleton.v1;/** *饿汉模式(静态变量) *类加载到内存后 , 就实例化一个单例 。 JVM保证线程安全 *简单使用 , 推荐使用 *唯一缺点:不管用到与否 , 类装载时就完成实例化 *Class.forName("") *(话说你不用的 , 你装载它干啥) */public class Singleton {// 1. 构造器私有化(防止new)private Singleton () {}// 2. 本类内部创建对象private final static Singleton instance = new Singleton();// 3. 提供一个公有的静态方法 , 返回实例对象 , 提供给外部使用public static Singleton getInstance() {return instance;}}class SingletonTest01 {public static void main(String[] args) {// 测试Singleton instance1 = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();System.out.println(instance1 == instance2); // trueSystem.out.println("instance1.hashCode=" + instance1.hashCode());System.out.println("instance2.hashCode=" + instance2.hashCode());}}
优缺点- 优点:写法简单 , 实际上在类装载的时候就完成类实例化 , 避免类线程同步问题 。
- 缺点:在类装载的时候就完成了实例化 , 没有实现 Lazy Loading 懒加载 的效果 。 如果从始至终就没有使用过这个实例 , 会造成内存的浪费 。
因此:这种单例模式可用 , 但是可能会造成内存的浪费 。 除非开发人员能肯定 , 此类一定会被用到 , 那么内存就不会被浪费 。
饿汉式(静态代码块)代码示例
/** * 饿汉式(静态代码块) */public class Singleton {// 1. 构造器私有化private Singleton() {}// 2. 本类内部创建对象实例private static Singleton instance;// 在静态代码块中 , 创建单例对象static {instance = new Singleton();}// 3. 提供一个公有的静态方法 , 返回实例对象public static Singleton getInstance() {return instance;}}
优缺点和上面一种很类似 , 都是在类内部实例化 , 只不过类的实例化放在了静态代码块中 。 类一加载 , 就执行类静态代码块中的代码 。 优缺点和上面一样 。
推荐阅读
- 三星新旗舰Galaxy S21系列发布倒计时3天
- 改变网络化办公 揭秘夏普新复合机系列
- 网络双面提速办公 夏普发布全新复印机系列
- 电脑报2020年度获奖产品:引领智能商务无线投影时代的明基E系列商务投影机
- 手机必须双扬声器 魅族17系列告诉你这不是噱头
- 三星S21系列再次3C认证 充电器或成为“可选”配件
- 三星竟为Galaxy S21系列提供900多种颜色配置
- 摩托罗拉发布2021款Moto G系列产品 内建大容量电池169美元起价
- 影像旗舰vivo X60系列正式开售 斩获多个线上平台双冠军
- 对标AirPods系列 JBL推出2021新款无线耳机阵容