23种设计模式之单例模式

我们也经常遇到类似的情况,为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,我们可以通过单例模式来实现,这就是单例模式的动机所在。

定义:

单例模式(Singleton
Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。

那么,怎么创建一个单例对象呢?

首先我们可以通过三个步骤来创建:

1、由于每次使用new关键字来实例化一个类时都将产生一个新对象,为了确保实例的唯一性,我们需要禁止类的外部直接使用new来创建对象,因此需要将该类的构造函数的可见性改为private,如下代码所示:

/* 私有构造方法,防止被实例化 */
	private Singleton() {
	}

2、将构造函数改为private修饰后该如何创建对象呢?不要着急,虽然类的外部无法再使用new来创建对象,但是在该类的内部还是可以创建的,因此,我们可以在类中创建并保存这个唯一实例。为了让外界可以访问这个唯一实例,需要在TaskManager中定义一个静态的TaskManager类型的私有成员变量,为了保证成员变量的封装性,我们将Singleton 类型的singleton对象的可见性设置为private,如下代码所示:

private static Singleton singleton = null;

3、但外界该如何使用该成员变量并何时实例化该成员变量呢?答案是增加一个公有的静态方法,如下代码所示:

 /* 静态工程方法,创建实例 */
	public static Singleton getInstance() {

		if (singleton == null) { // 必需加这个判断,不然每次调用getInstance()都会new出来一个新对象,使其指向新对象,原来的数据会没了被重新初始化了。或者private static Singleton singleton =new Singleton(),就不用判断了,直接返回singleton
			synchronized (singleton) {//同步代码块,在多线程环境中保证线程安全
				if (singleton == null) {//要加if判断语句,因为当有两个线程A、B同时进入第一个if判断语句中时,如果同步代码块里面没有if判断语句,则A线程进入synchronized加锁new出个对象后解锁,B线程进入synchronized也会new出个对象,这样就有线程安全问题
					singleton = new Singleton();
				}
			}

		}
		return singleton;

	}

在getInstance()方法中首先判断singleton对象是否存在,如果不存在(即singleton ==
null),则使用new关键字创建一个新的Singleton类型的singleton对象,再返回新创建的singleton对象;否则直接返回已有的singleton对象。

在类外我们无法直接创建新的Singleton对象,但可以通过代码Singleton.getInstance()来访问实例对象,第一次调用getInstance()方法时将创建唯一实例,再次调用时将返回第一次创建的实例,从而确保实例对象的唯一性。

单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

那么来看一个完整的单例模式代码:

public class Singleton {

	private static Singleton singleton = null;//static方法中不能用非static全局变量,赋值为null作用是延迟创建对象
	/* 私有构造方法,防止被实例化 */
	private Singleton() {
	}
	 /* 静态工程方法,创建实例 */
	public static Singleton getInstance() {

		if (singleton == null) { // 必需加这个判断,不然每次调用getInstance()都会new出来一个新对象,使其指向新对象,原来的数据会没了被重新初始化了。或者private static Singleton singleton =new Singleton(),就不用判断了,直接返回singleton
			synchronized (singleton) {//同步代码块,在多线程环境中保证线程安全
				if (singleton == null) {//要加if判断语句,因为当有两个线程A、B同时进入第一个if判断语句中时,如果同步代码块里面没有if判断语句,则A线程进入synchronized加锁new出个对象后解锁,B线程进入synchronized也会new出个对象,这样就有线程安全问题
					singleton = new Singleton();
				}
			}

		}
		return singleton;

	}

}
时间: 2024-10-05 07:04:37

23种设计模式之单例模式的相关文章

重头开始学23种设计模式:单例模式

最近感觉做程序又开始浑浑噩噩,对设计模式和算法基本了解,但基本不会用.所以打算最近1个月把设计模式和算法重新,温故而知新下. 首先从程序开发经常涉及到的23种设计模式开始,希望这次能更加熟练的运用设计模式来加强自己的开发能力. 首先从单例模式开始: 单例模式在我的理解是对程序对象的缓存,防止不断new,保持对象唯一性,提高程序性能. namespace SinglePattern { class Program { static void Main(string[] args) { for (i

23种设计模式(一) 单例模式

单例模式 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式是23种设计模式中最简单的一种,它有三个要素: 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例.饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用:而懒汉式在调用取得实例方法的时候才会实例化对象. 饿汉式单例 public class Singleton { private static

23种设计模式(1)-单例模式

定义: 单例模式,是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例的特殊类,通过单例模式可以保证系统中一个类只有一个实例,即一个类只有一个对象实例. 特点: 1.单例类只能有一个实例 2.单例类必须自己创建自己的唯一实例 3.单例类必须给其他对象提供这一实例 单例模式要点: 1.私有的构造方法 2.指向自己实例的私有静态引用 3.以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象的时机的不同分为两种: 1.一种是饿汉式单例,一种是懒汉式单例. 饿汉式单例在单例被加载的时候

java基础之----23种设计模式(单例模式)

概述 提到单例模式,我们并不陌生,而且面试中也常常会问单例模式相关的问题,接下来就谈谈单例模式,这篇文章会回答如下几个问题: 什么是单例模式? 单例模式有几种实现方式,以及各种实现方式的优劣? 单例模式有什么用? 什么是单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点.这是<设计模式>(艾迪生维斯理, 1994)中的定义. 单例模式有几种实现方式 先说答案,有三种,基本上我们只知道两种,就是懒汉式和饿汉式,其实还有第三种,通过静态内部类实现单例模式,下面就说说这三种实现方式. 饿

JAVA设计模式总结之23种设计模式

一.什么是设计模式                                                                                                                                        设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于

23种设计模式(1):单例模式

转:http://blog.csdn.net/zhengzhb/article/details/7331369 ———————————————————————————————————————— 定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名.属性.方法 2.以<<开头和以>>结尾的为注释信息 3.修饰符+代表public,-代表private,#代表protected,什么都没有代表包可

23种设计模式第一种(单例模式)

单例模式单例模式 ------------------------------------------------------------------------------------------------------- 确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. -------------------------------------------------------------------------------------------------- 创建类模式

23种设计模式系列之单例模式

本文继续介绍23种设计模式系列之单例模式. 概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周