Singleton的意思即是独身,也就是只有一个人,应用在OO上,通常译作单例:只有一个实例(Instance)。
很多时候,你会需要Singleton模式,例如打印机管理,你希望程序中只能有一个PrintSpooler,以避免两个打印动作同时如入到打印机中;又例如数据库管理,因为建立连接对象会消耗资源,你希望程序中只能有一个连接对象,所有的其他程序都透过这个对象来连接数据库,以避免连接对象的重复初始化造成资源的消耗。
以打印机的设计为例,有的设计人员会采用全局变量来建立实例,并在程序中随机去用这个实例,Java虽然不支持全局变量,但透过将对象包装在一个类里面,也有人采用这样的写法:
public class PrintSpooler {
public PrintSpooler() {
// ....
}
public Connection getSpooler(){
....
}
}
public class GlobalObject {
private PrintSpooler printSpooler;
public GlobalObject () {
printSpooler = new PrintSpooler();
...
}
public void getPrintSpooler() {
return printSpooler;
}
}
无乱全局变量还是以上的例子,都无法保证只产生唯一的实例,也许你不会犯这个错误,但与你共同工作的伙伴也许会直觉的使用这种方法来产生一个PrintSpooler实例。
Singleton模式可以保证一个类只有一个实例,并提供一个访问这个实力的方法。
一个Singleton实现好比Java中的java.lang.Runtime类,每个Java程序运行时都有一个唯一的Runtime对象,可以透过它提供的静态方法getRuntime()来取得这个对象,例如:
Runtime runtime = Runtime.getRuntime();
取得Runtime对象之后,你可以透过它尽心一些外部命令的执行、进行垃圾处理等指令,你可以查看Runtime.java类的源码,开头的几行是这样写的:
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
/** Don't let anyone else instantiate this class */
private Runtime() {}
// 以下略
}
以上的结构即采用Singleton模式设计,其结构使用UML来表示如下:
如上所示,使用静态工厂来取得Runtime对象,其中Runtime的构造函数被声明为private,这样就可以组织其他人使用构造函数来建立实例;使用更一般化的表示单例的UML结构,如下图所示:
有几个实现以上结构的方法,可以再第一次需要实例是再建立对象,也就是采用所谓的Lazy Initialization:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
// ....
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
// .. 其它实现
}
以上实现使用于单线程的程序,在多线程的程序下,以下的写法在多个线程的竞争资源下,将让有可能产生两个以上的实例,例如以下情况:
Thread1: if(instance == null) // true
Thread2: if(instance == null) // true
Thread1: instance = new Singleton(); // 产生一个实例
Thread2: instance = new Singleton(); // 又产生一个实例
Thread1: return instance; // 又返回一个实例
Thread2: return instance; // 又返回一个实例
在多线程的环境下,为了避免竞争资源,加上同步(synchronized)机制:
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
synchronized static public Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
不过这种简单的写法不适合用于像服务器这种多线程的程序上,同步机制会造成相当的性能低下,为了估计Singleton、Lazy Initialization的效率问题,因而有了Double-check Locking的模式:
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null){
synchronized(Singleton.class){
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
Java中的Runtime类的做法就简单得多了,它舍弃了Lazy Initialization,如果你的实例初始化不需要很长时间的话,可以使用这种方式:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// ....
}
public static Singleton getInstance() {
return instance;
}
// 其它实现
}
- 大小: 10 KB
- 大小: 10.3 KB
分享到:
相关推荐
### C++中实现Singleton模式的关键知识点 #### 一、Singleton模式简介 Singleton模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中经常被用于控制对共享资源...
**C++实现的Singleton模式详解** Singleton模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源,如数据库连接池,或者确保某个...
### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...
### 最简单的设计模式学习:Singleton模式 #### 一、Singleton模式简介 Singleton(单例)模式是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在许多场合下非常...
Singleton模式是设计模式中的一种创建型模式,它在软件工程中扮演着重要的角色。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。Singleton模式的应用场景通常涉及到系统...
Singleton模式: 确保一个类只有唯一的一个实例。 Singleton主要用于对象的创建,这意味着,如果某个类采用了Singleton模式,则在这个类被创建后,它将有且仅有一个实例可供访问。很多时候我们都会需要Singleton...
Singleton模式是一种设计模式,它是创建型模式的一种,用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式在系统中需要频繁创建和销毁对象,且对象需要共享资源时非常有用,比如配置...
《C#设计模式之Singleton模式详解》 Singleton模式是软件设计模式中的一种基础模式,它在众多设计模式中占有重要地位,尤其在C#编程中经常被应用。Singleton模式的主要目的是确保一个类只有一个实例,并提供一个...
在Java编程中,Singleton模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。线程安全的Singleton模式对于多线程环境尤为重要,因为它可以防止多个线程同时创建多个实例。本文将详细介绍...
【深入浅出单例Singleton模式】 单例模式是一种在软件设计中常见的设计模式,它的核心目标是确保一个类只有一个实例,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于控制资源的共享,如全局...
这里我们将深入探讨三种常见的Java设计模式:单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。 **单例模式(Singleton)** 单例模式确保一个类只有一个实例,并提供一个全局访问点...
双重检测锁(Double-Checked Locking)实现的Singleton模式在多线程应用中有相当的价值。在ACE的实现中就大量使用ACE_Singleton模板类将普通类转换成具有Singleton行为的类。这种方式很好地消除了一些重复代码臭味,...
综上所述,Qt Qml的Singleton模式为全局共享对象提供了方便,使得在Qml环境中管理和访问同一对象变得简单。通过C++和Qml的有效结合,我们可以构建出高效且易于维护的应用程序。了解和熟练运用Singleton模式,对于...
在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将详细探讨这些实现方法并进行对比。 ### 1. 饿汉式(Static Final Field) 这是最简单的Singleton实现方式,通过静态初始化器在类加载时就...
接下来,我们将深入探讨Java Singleton模式的实现方式、优缺点以及使用场景。 一、Singleton模式的实现 1. 饿汉式(静态常量) ```java public class Singleton { private static final Singleton INSTANCE = ...
单态模式(Singleton模式)是Java设计模式中的一种,它的主要目标是确保一个类在整个应用程序中只有一个实例存在。这种模式的应用场景广泛,特别是在需要全局共享的资源管理、配置中心、日志服务等场合非常常见。 ...