GOF23设计模式之单例模式

·核心作用:

  -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

·常见应用场景:

  -Windows的Task Manager(任务管理器)就是很典型的单例模式

  -Windows的Recycle Bin(回收站)也是很典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例

  -项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取

  -网站的计数器,一般也是采用单例模式实现,否则难以同步

  -应用程序的日志应用,一般都采用单例模式实现,这一般是由于共享日志文件一直处于打开状态,因为只能一个实例去操作,否则内容不好追加

  -数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源

  -操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统

  -Application也是单例的典型应用(Servlet编程中会涉及到)

  -在servlet编程中,每个servlet也是单例

  -在Spring中,每个Bean默认就是单例,这样做的优点是Spring容器可以管理

  -在SpringMVC框架中,控制对象(Controller)也是单例

·单例模式的优点:

  -由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一 个单例对象,然后永久驻留在内存中的方式来解决

  -单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理

·常见的五种单例模式实现方式:

  -主要:

    饿汉式(线程安全,调用效率高。但是,不能延时加载)

    懒汉式(线程安全,调用效率不高。但是,可以延时加载)

  -其他:

    双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)

    静态内部类式(线程安全,调用效率高。可以延时加载)

    枚举单例(线程安全,调用效率高,不能延时加载)

/**
 * 饿汉式单例模式实现
 * 问题:如果只是加载本类,而不是要调用getInstance(),甚至永远没有调用,则会造成资源的浪费
 * @author XuZeSen
 *
 */
public class SingletonDemo1 {
	//类初始化时,立即加载这个对象(没有延时加载的优势),静态变量加载是天然的线程安全
	private static SingletonDemo1 instance = new SingletonDemo1();
	//构造器私有化
	private SingletonDemo1() {
	}
	//定义一个全局的访问点,访问这个单例对象,方法没有同步,调用效率高
	public static SingletonDemo1 getInstance(){
		return instance;
	}
}

  

 

/**
 * 懒汉式单例模式实现
 * 问题:资源利用率高了,但是,每次调用getInstance()方法都要同步,并发效率较低
 * @author XuZeSen
 *
 */
public class SingletonDemo2 {
	//类初始化时,没有立即加载这个对象(延时加载,真正用到的时候再创建)
	private static SingletonDemo2 instance;
	//构造器私有化
	private SingletonDemo2() {
	}
	//方法同步,调用效率低
	public static synchronized SingletonDemo2 getInstance(){
		if(null == instance){
			instance = new SingletonDemo2();
		}
		return instance;
	}
}

  

/**
 * 双重检测锁实现
 * 这个模式下将内容同步到if内部,提高了执行的效率,不必每次获取对象时都进行同步
 * 只有第一次同步创建了
 * @author Sen
 *
 */
public class SingletonDemo3 {
	private static SingletonDemo3 instance = null;
	private SingletonDemo3() {
	}
	public static SingletonDemo3 getInstance(){
		if(null == instance){
			SingletonDemo3 temp;
			synchronized (SingletonDemo3.class) {
				temp = instance;
				if(null == temp){
					synchronized (SingletonDemo3.class) {
						temp  = new SingletonDemo3();
					}
				}
				instance = temp;
			}
		}
		return instance;
	}
}

  

/**
 * 静态内部类单例模式实现
 * 外部类没有static属性,则不会像饿汉式那样立即加载对象
 * 兼备了并发高效调用和延时加载的优势
 * @author XuZeSen
 *
 */
public class SingletonDemo4 {
	//构造器私有化
	private SingletonDemo4() {
	}
	//instance是static final类型,保证了内存中只有一个这样的实例存在,而且只能被赋值一次,从而保证了线程安全性
	private static class SingletonClassInatance{
		private static final SingletonDemo4 instance = new SingletonDemo4();
	}
	//只有真正调用getInstance(),才会加载静态内部类。加载类时是线程安全的。
	public static  SingletonDemo4 getInstance(){
		return SingletonClassInatance.instance;
	}
}

  

 

/**
 * 枚举式单例模式实现(没有延时加载)
 * @author XuZeSen
 *
 */
public enum SingletonDemo5 {

	//这个枚举元素,本身就是单例对象
	INSTANCE;

	//添加自己需要的操作!
	public void singletonOperation(){

	}
}

  

时间: 2024-08-07 00:18:55

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

【GOF23设计模式】单例模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_单例模式.应用场景.饿汉式.懒汉式 1.GOF23设计模式  2.单例模式  3.饿汉式  1 package com.test.singleton; 2 /** 3 * 测试饿汉式单例模式 4 */ 5 public class SingletonDemo01 { 6 7 //类初始化时,立即加载这个对象(没有延时加载的优势).加载类时,天然的是线程安全的! 8 private static SingletonDem

【GOF23设计模式】--单例模式

核心作用: 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 常见应用场景 windows的任务管理器 windows的回收站 项目中,读取配置文件的类 网站的计数器,否则难以同步 应用程序的日志应用,一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加 数据库连接池的设计一般也是采用单例,因为数据库连接是一种数据库资源 Servlet的Application内置对象 Servlet编程中每个servlet也是单例的 Spring中每个bean默认就是单

Java设计模式:单例模式

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

[转]JAVA设计模式之单例模式

原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话

设计模式 之 单例模式

单例模式思路: 私有化构造方法: 防止实例化 私有化克隆方法: 防止克隆 私有化静态属性: 保存对象 公有化静态方法: 获取对象 代码: <?php //设计模式:单例模式 class Singleton { //私有化静态属性:用于保存对象 private static $obj; //私有化构造方法 private function __construct(){} //公有化静态方法:用于实例化对象 public static function getObj() { //判断对象是否存在 i

设计模式实例学习-单例模式(Android中的使用场景)

1.设计模式实例-单例模式 单例模式,故名思议,是指在一个类中通过设置静态使得其仅创造一个唯一的实例.这样设置的目的是满足开发者的希望--这个类只需要被实例化创建一次,同时因为其为静态的缘故,加载的速度也应该快于正常实例化一个类的速度(理论上). 在Android开发中,当我们需要创建一个Fragment的时候常常会用到这样的模式,没有代码的学习是虚无的,接下来亮代码学习: public class SelectFrame extends Fragment { private final sta

(九)JAVA设计模式之单例模式

JAVA设计模式之单例模式 一.单例模式的介绍 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点.     全局对象和Singleton模式有本质的区别,因为大量使用全局对象会使得程序质量降低,而且有些编程语言根本不支持全局变量.最重要的是传统的全局对象并不能阻止一个类被实例化多次. 二.单例模式的特点 单例类只能有一个实例 单例类必须自己创建自己的唯一实例. 单例类必须给所有其他对象提供这一实例.

C#设计模式(1)——单例模式

一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设计模式>,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考.首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二.单例模式的介绍 说到单例模式,大家第一反应应该就是——什么是单例模式?,从“单例”字面意思上理解为——一个类只有一个实例,所以单例模式也就是保证一个类只

.NET设计模式之(单例模式)

1.单例模式,一个类只能new一个对象 2.举例,资源管理器,文件管理器,地球等: 3.创建单例: (1)创建一个Earth类 class Earth { public Earth() { } } (2)将构造函数 私有化 class Earth { private Earth() { } } (3)声明一个静态私有的字段,初始化一个实例 class Earth { private static Earth instance=new Earth(); private Earth() { } }