《Head First 设计模式》:单件模式
时间:2020-08-01
本文章向大家介绍《Head First 设计模式》:单件模式,主要包括《Head First 设计模式》:单件模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
正文
一、定义
单件模式确保一个类只有一个实例,并提供一个全局访问点。
要点:
- 定义持有唯一单件实例的类变量。
- 私有化构造,避免其他类产生实例。
- 对外提供获取单件实例的静态方法。
二、实现步骤
1、创建单件类
(1)方式一:懒汉式
延迟创建单件实例。
线程不安全:
/**
* 单件类(懒汉式、线程不安全)
*/
public class Singleton {
/**
* 唯一单件实例
*/
private static Singleton uniqueInstance;
/**
* 私有构造
*/
private Singleton() {}
/**
* 获取单件实例
*/
public static Singleton getInstance() {
if (uniqueInstance == null) {
// 延迟创建单件实例
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
线程安全:
/**
* 单件类(懒汉式、线程安全)
*/
public class Singleton {
/**
* 唯一单件实例
*/
private static Singleton uniqueInstance;
/**
* 私有构造
*/
private Singleton() {}
/**
* 获取单件实例(同步方法)
*/
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
// 延迟创建单件实例
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
(2)方式二:饿汉式
“急切”创建单件实例。
/**
* 单件类(饿汉式)
*/
public class Singleton {
/**
* 唯一单件实例(“急切”创建单件实例)
*/
private static Singleton uniqueInstance = new Singleton();
/**
* 私有构造
*/
private Singleton() {}
/**
* 获取单件实例
*/
public static Singleton getInstance() {
return uniqueInstance;
}
}
(3)方式三:双检锁
/**
* 单件类(双重检查加锁)
*/
public class Singleton {
/**
* 唯一单件实例
*/
private volatile static Singleton uniqueInstance;
/**
* 私有构造
*/
private Singleton() {}
/**
* 获取单件实例
*/
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
2、使用单件类获取唯一单件实例
public class Test {
public static void main(String[] args) {
// 获取单件实例
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton2);
}
}
原文地址:https://www.cnblogs.com/jingqueyimu/p/13416809.html
- Kafka集群安装
- 知其所以然之永不遗忘的算法
- ZOOKEEPER集群搭建及测试
- 【Python环境】Scikit-Learn:开源的机器学习Python模块
- 【Python环境】可爱的 Python: 自然语言工具包入门
- 电脑静音工作,又听不到12306的来票音乐,纠结啊 !但春节前工作多任务重,不能安心工作,就动手做个“无声购票弹窗”工具吧!
- .net访问PostgreSQL数据库发生“找不到函数名”的问题追踪
- “领域驱动开发”实例之旅(1)--不一样的开发模式 一、分析业务需求。 二、设计领域对象模型 三、测试领域对象模型 四、设计业务处理类 五、设计Entity和Vi
- Java基础——左移和右移
- 【Python环境】利用 Python、SciKit 和文本分类来实现行为分析
- LJMM平台( Linux +Jexus+MySQL+mono) 上使用MySQL的简单总结
- 判断两个单链表是否相交(有环、无环两种)
- 【数据科学家】SparkR:数据科学家的新利器
- KMP算法浅析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Grafana + InfluxDB 实现 Jmeter 压测的图形化监控
- Android 浮动编辑框的具体实现代码
- Android实现Path平滑的涂鸦效果实例
- Android CameraManager类详解
- Android开发实现自定义水平滚动的容器示例
- Android Studio开发之 JNI 篇的简单示例
- Android自定义View播放Gif动画的示例
- Android下拉框PopupWindow使用详解
- Android实现自动文本框提示功能
- Android开发实现拍照功能的方法实例解析
- Android开发实现模仿360二维码扫描功能实例详解
- Android中控制和禁止ScrollView自动滑动到底部的方法
- ImageView 实现Android colorPikcer 选择器的示例代码
- Android Notification.Builder通知案例分享
- SimpleCommand实现上传文件或视频功能(四)