单例模式应该是23种设计模式中最简单的一种。这里的简单我觉得应该是代码实现上的简单和思维的简单:类只提供一个全局变量。但是虽然简单,但若仔细研究,亦有万千变化,深藏奥妙。
1. 定义:
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
这个类称为单例类
2. 单例模式 特点
a. 单例类只可有一个实例
b.单例类必须自己创建自己这惟一的实例
c.单例类必须给所有其他对象提供这一实例
1. 一个简单的单例模式
/** * 实现最简单的单例模式 */ public class SimpleSingleton { private static final SimpleSingleton singleton = new SimpleSingleton();//变量为static,final private SimpleSingleton(){};//构造方法声明为私有,这样就保证了只能有一个对象存在 //提供一个外部得到类的方法 public static SimpleSingleton getInstance(){ return singleton; } }
上面的代码目测存在两个问题:1. 不管singleton会被使用都是会被创建
2. 尽管构造器被定义为private,但是利用java的反射类仍然是会被实例化
2. 做一个优化吧
/** * 做了些许优化的单例模式 */ public class LazySingleton { private static LazySingleton singleton = null;//不再做实例化操作 private LazySingleton(){};//构造方法声明为私有,这样就保证了只能有一个对象存在 //提供一个外部得到类的方法 public static LazySingleton getInstance(){ //这里做一个判断,当对象为null时才初始化 if(null==singleton){ singleton = new LazySingleton(); } return singleton; } }
上面的代码目测存在一个问题就是线程安全的问题。就是如果多个地方同时调用getInstance方法。有可能,存在if的判断的已经通过,但是还没来得及调用new 方法,下一个调用又进来,这样也会进入到if的代码块中,导致会new 出来多个对象。
关于线程安全问题
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题
3. 再优化一下,加上synchronized
/** * 做了些许优化的单例模式 */ public class LazySingleton { private static LazySingleton singleton = null;//不再做实例化操作 private LazySingleton(){};//构造方法声明为私有,这样就保证了只能有一个对象存在 //提供一个外部得到类的方法 public synchronized static LazySingleton getInstance(){ //这里做一个判断,当对象为null时才初始 if(null==singleton){ singleton = new LazySingleton(); } return singleton; } }
但是如果太多的synchronized会涉及到性能问题,所以要改变加锁的位置
/** * 做了些许优化的单例模式 */ public class LazySingleton { private static LazySingleton singleton = null;// 不再做实例化操作 private LazySingleton(){};// 构造方法声明为私有,这样就保证了只能有一个对象存在 // 提供一个外部得到类的方法 public synchronized static LazySingleton getInstance() { if (null == singleton) { //锁加在这里 synchronized (LazySingleton.class) { if (null == singleton) { singleton = new LazySingleton(); } } } return singleton; } }
参考源文档<http://blog.csdn.net/gf771115/article/details/9031269>,此处致谢
相关推荐
Python 115.设计模式_单例模式实现.mp4
计算机后端-Java-Java核心基础-第15章 面向对象07 14. 设计模式与单例设计模式.avi
单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式通常有多种方式,包括懒汉模式、饿汉模式、静态内部类以及枚举类型。 1. **懒汉模式**: 懒汉...
单例模式是软件设计模式中的经典模式之一,其主要目的是控制类的实例化过程,确保在应用程序的整个生命周期中,某个类只有一个实例存在。这样的设计通常适用于那些需要频繁创建和销毁,但资源消耗较大的对象,如...
单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 比如在某个服务器程序中,该服务器的配置信息存放...
单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...
细心整合和单例模式和工厂模式的几种模型,懒汉式,饿汉式,如何并发操作模式,等都有详细讲解
C++单例设计模式,单例模式 C++单例设计模式,单例模式
"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...
python 设计模式之单例模式
【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种设计模式.zip 【Java设计模式】《设计模式之禅》中的23种...
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
Java设计模式之单例模式的七种写法 单例模式是一种常见的设计模式,它确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机的驱动程序对象常...
为了帮助大家快速和较好地理解JavaScript设计模式中的单例模式,本文对JavaScript的单例模式进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。
Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...
入名所示,该文件为最详细的Java单例模式讲解并附有讲解代码。主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免...