创建对象——单例(Singleton)模式
单例(Singleton)模式:
最简单的单例模式:
- 保证该类构造方法是私有的,外部无法创建该类型的对象;
- 提供一个全局访问点,方便给客户对象提供对此单例对象的使用;
public class Singleton {
/**
* 私有变量,外界无法访问
* 可以定义 public 类型 instance变量,把属性直接暴露给客户对象,则没必要实现getInstance()方法
* 但是可读性降低,而且直接暴露实例变量的名字给客户程序,会增加代码的耦合度
*/
private static Singleton instance = new Singleton();
static {
//...
}
// 唯一的 private构造方法,客户对象无法创建该对象实例
private Singleton() {
}
// 全局访问点
public static Singleton getInstance() {
return instance;
}
}
// 客户使用单例模式代码
Singleton singleton = Singleton.getInstance();
进阶:
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
| Thread 1 | Thread 2 | |
| 1 | if (instance == null) | |
| 2 | if (instance == null) | |
| 3 | Singleton instance = new Singleton(); | |
| 4 | Singleton instance = new Singleton(); | |
| 5 | return instance; | |
| 6 | return instance; |
public static synchronized Singleton getInstance() {
if ( instance == null ) {
instance = new Singleton();
}
return instance ;
}
public static Singleton getInstance() {
if ( instance == null ) {
synchronized (Singleton. class ) {
if ( instance == null ) {
instance = new Singleton();
}
}
}
return instance ;
}
public class LazyLoadedSingleton {
private LazyLoadedSingleton {
}
private static class LazyHolder{
private static final LazyLoadedSingleton singletonInstatnce = new LazyLoadedSingleton();
}
public static LazyLoadedSingleton getInstance() {
return LazyHolder.singletonInstatnce;
}
}
public class SerializableSingleton implements Serializable {
private static final long serialVersionUID = 4285441628073602932L;
static SerializableSingleton singleton = new SerializableSingleton();
private SerializableSingleton() {
}
private Object readResolve () {
return singleton ;
}
}
创建对象——单例(Singleton)模式的更多相关文章
- 漫谈设计模式(二):单例(Singleton)模式
1.前言 实际业务中,大多业务类只需要一个对象就能完成所有工作,另外再创建其他对象就显得浪费内存空间了,例如web开发中的servlet,这时便要用到单例模式,就如其名一样,此模式使某个类只能生成唯一 ...
- JAVA中实现单例(Singleton)模式的八种方式
单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 基本的实现思路 单 ...
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- 设计一个线程安全的单例(Singleton)模式
在设计单例模式的时候.尽管非常easy设计出符合单例模式原则的类类型,可是考虑到垃圾回收机制以及线程安全性.须要我们思考的很多其它.有些设计尽管能够勉强满足项目要求,可是在进行多线程设计的时候.不考虑 ...
- Android与设计模式——单例(Singleton)模式
概念: java中单例模式是一种常见的设计模式.单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类仅仅能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...
- 单例Singleton模式的两种实现方法
在设计模式中,有一种叫Singleton模式的,用它可以实现一次只运行一个实例.就是说在程序运行期间,某个类只能有一个实例在运行.这种模式用途比较广泛,会经常用到,下面是Singleton模式的两种实 ...
- 设计模式C++描述----01.单例(Singleton)模式
一.概念 单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. class CSingleton { //公有的静态方法,来获取该实例 public: s ...
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
- 单例/单体模式(Singleton)
单例/单体模式(Singleton) 首先,单例模式是对象的创建模式之一,此外还包括工厂模式. 单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3, ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
随机推荐
- oracle的processes和session最大限制
1.现象:oracle运行了一段时间后出现用户名连接不上,提示process已经达到最大值. 2.解决: --管理员身份登录 sqlplus / as sysdba --修改processes最大值, ...
- html实现类似excel的复杂表格,及导出到excel
1. excellentexport.js https://github.com/jmaister/excellentexport/tree/2.0.3 2.fiddle example https ...
- react组件是怎么来的
组件的创造方法为React.createClass() ——创造一个类,react系统内部设计了一套类系统,利用它来创造react组件.但这并不是必须的,我们还可以用es6的class类来创造组件,这 ...
- ACdream区域赛指导赛之手速赛系列(5) 题解
A - Problem A Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submi ...
- [翻译角]Learn From George, Not Pinocchio(ESLPOD)
以下转自www.eslpod.com,翻译为本人添加.其余版权均归原网站所有. ESLPOD是一个英语学习网站,我最初知道这个网站,是因为“奶爸”<把你的英语用起来>一书的推荐. ESLP ...
- java jmenu的替代方案
本来想实现一个类似jmenu的窗口,但是发现找了半天也没从L&F中找到实现menu的消失的头绪,最后还是使用了替代方案 使用JDialog来模拟一个menu的窗口,设置 setModel(fa ...
- C# oracle 参数传递的多种方式 留着复习
ORA-01036 非法的变量名/编号,(解决) 博客分类: oracle SQL 下边的代码就会造成 ORA-01036 非法的变量名/编号 cmd.CommandText = "SE ...
- Oracle高水位线
Oracle高水位线 https://blog.csdn.net/jx_jy/article/details/50607790 Oracle高水位线的概念 Oracle里面的对象放到存储级别都称为se ...
- [Codeforces 339D] Xenia and Bit Operations
[题目链接] https://codeforces.com/problemset/problem/339/D [算法] 线段树模拟即可 时间复杂度 :O(MN) [代码] #include<bi ...
- 关于mysql的索引原理与慢查询优化
大多情况下我们都知道加索引能提高查询效率,但是应该如何加索引呢?索引的顺序如何呢? 大家看一下下面的sql语句(在没有看下面的优化的方法之前)应该如何优化加索引以及优化sql语句: 1.select ...