单例(Singleton)设计模式保证每个类只有一个实例,并为这个实例提供一个全局的访问点。
与工具类中静态成员不同,单例类一般用来保存应用程序的状态数据,这些数据在应用程序的各个部分都可能被访问或修改。
单例模式的几种实现方式。
- publicclassSingleton{
-
privatestaticSingletoninstance=newSingleton();
-
publicstaticSingletongetInstance(){
-
returninstance;
- }
-
-
privateSingleton(){
- }
- }
public class Singleton{
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
/** Don't let anyone else instantiate this class */
private Singleton() {
}
}
这种方式实现简单,并且保证实例的唯一性,缺点是必须先加载后使用,而且不管单例类是否真正使用到,实例总是会先被加载,这看起来相当的不妥,因而有了懒加载(Lazy Initialization)的模式。
- publicclassSingleton{
-
privatestaticSingletoninstance=null;
-
privateSingleton(){
- }
-
publicstaticSingletongetInstance(){
-
if(instance==null){
-
instance=newSingleton();
- }
-
returninstance;
- }
- }
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种方式可以实现懒加载,但当多个线程同时进入getInstance方法时,可能会产生多份实例,这显然违背单例模式的初衷。为了避免这种情况,考虑加上同步(synchronized)机制。
- publicclassSingleton{
-
privatestaticSingletoninstance=null;
-
privateSingleton(){
- }
-
synchronizedstaticpublicSingletongetInstance(){
-
if(instance==null){
-
instance=newSingleton();
- }
-
returninstance;
- }
- }
public class Singleton {
private static Singleton instance = null;
private Singleton(){
}
synchronized static public Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种方式可以在懒加载的同时保证只有一份实例,但对整个getInstance方法作同步处理会带来线程同步上的性能消耗。
- publicclassSingleton{
-
privatestaticSingletoninstance;
-
privateSingleton(){
- }
-
publicstaticSingletongetInstance(){
-
if(instance==null){
-
synchronized(Singleton.class){
-
if(instance==null){
-
instance=newSingleton();
- }
- }
- }
-
returninstance;
- }
- }
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance() {
if (instance == null){
synchronized(Singleton.class){
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
上面的方式就是所谓的Double-check Locking即双重检查和锁定模式,目前看来很完美。
分享到:
相关推荐
设计模式C++学习之单例模式(Singleton)
单例设计模式Singleton1
Java面向对象(高级)-- 单例(Singleton)设计模式
简单的单例模式举例Singleton 分为恶汉式 懒汉式
设计模式总结-模板设计模式,单例模式(singleTon)
IOS 单例设计模式实例Demo 单例 设计 模式 IOS Singleton
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
单例模式(Singleton Pattern)是 Java 中最常见的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
设计模式系列之01-单例模式(Singleton模式),很好的资源,理论实践结合讲述,逐步更新
一个产生随机数的例子,整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811
本文档,是利用C++来实现设计模式中的,单例模式,里面有内容说明和相关实例代码介绍
java设计模式,单例模式的不同实现方式
本文实例讲述了JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能。分享给大家供大家参考,具体如下: 单例模式 单例模式的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中...
C# 23种设计模式之单例模式源码
主要介绍了单例模式 Singleton 简单实例设计模式解析的相关资料,需要的朋友可以参考下
PHP单例设计模式,连接多数据库源码 单例模式的三个特点 1: 一个类只能有一个实例 2: 它保修自行创建这个实例 3: 必须自行向整个系统提供这个实例. 单例模式中主要的角色 Singleton定义一个Instance操作,允许客户...
设计模式里面的单例模式程序 package com.rrppff; public class Singleton { private static String name; public static String getName() { return name; } public static void setName(String name) { ...
php /** * 单例模式 * * 保证一个类仅有一个实例,并提供一个访问它的全局访问点 * */ class Singleton { static private $_instance = null; private function __construct() { } static public function ...
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 学习demo