java23种模式之单例模式

JAVA23种设计模式四——单例模式

单例模式是一种常用的软件设计模式,在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

什么是单例模式?

一个类有且仅有一个实例,并且自行实例化向整个系统提供。

也就是说,在整个程序空间中,该类只存在一个实例对象。

GoF对单例模式的定义:

保证一个类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

为什么要使用单例模式?

对于系统中的某些类来说,只有一个实例很重要。比如:一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。在多线程之间,比如servlet环境,共享一个资源或者操作同一个对象,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例模式。

单例模式的三个要点:

一是某个类只能有一个实例;

二是它必须自行创建这个实例;

三是它必须自行向整个系统提供这个实例。

具体一点就是:

一是单例模式的类只提供私有的构造函数;

二是类定义中含有一个该类的静态私有对象;

三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。

一般Singleton模式通常有三种形式:

第一种:饿汉式

// MainClass.java
public class MainClass {
	public static void main(String[] args)
	{
		Person per=Person.getPerson();
		Person per2=Person.getPerson();
		per.setName("张三");
		per2.setName("李四");

		System.out.println(per.getName());
		System.out.println(per2.getName());
	}
}
// Person.java
public class Person {
	public static final Person person=new Person();
	// 保证该类里只有一个实例
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// 构造函数私有化
	private Person()
	{
	}
	// 提供一个全局的静态方法
	public static Person getPerson()
	{
		return person;
	}
}

第二种:懒汉式

// MainClass.java
public class MainClass {
	public static void main(String[] args)
	{
		Person2 per=Person2.getPerson();
		Person2 per2=Person2.getPerson();
		per.setName("张三");
		per2.setName("李四");

		System.out.println(per.getName());
		System.out.println(per2.getName());
	}
}
// Person2.java
public class Person2 {
	// 保证该类里只有一个实例
	private String name;
	// 声明一个静态的person
	private static Person2 person;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// 构造函数私有化
	private Person2()
	{
	}
	// 提供一个全局的静态方法
	public static Person2 getPerson()
	{
		// 在这里需要加一个判断,否则在主方法里会产生两个不同的对象
		if(person==null)
		{
			person=new Person2();
		}
		return person;
	}
}

结果还是:李四

李四

在上面Person2.java代码中,适用于单线程的情况,不适用多线程,要想适用多线程,需将相应代码修改为:

// 提供一个全局的静态方法,使用同步方法
		public static synchronized Person2 getPerson()
		{
			// 在这里需要加一个判断,否则在主方法里会产生两个不同的对象
			if(person==null)
			{
				person=new Person2();
			}
			return person;
		}

这种做法又致使效率大大降低,因为每次获取对象时,都要进行同步!

第三种:双重检查

// MainClass.java
public class MainClass {
	public static void main(String[] args)
	{
		Person3 per=Person3.getPerson();
		Person3 per2=Person3.getPerson();
		per.setName("张三");
		per2.setName("李四");

		System.out.println(per.getName());
		System.out.println(per2.getName());
	}
}
// Person3.java
public class Person3 {
	// 保证该类里只有一个实例
		private String name;
		// 声明一个静态的person
		private static Person3 person;

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		// 构造函数私有化
		private Person3()
		{
		}
		// 提供一个全局的静态方法
		public static Person3 getPerson()
		{
			// 双重检查,效率大大提高
			if(person==null)
			{
				synchronized (Person3.class)
				{
					if(person==null)
					{
						person=new Person3();
					}
				}
			}
			return person;
		}
}

这种模式大大提高了执行效率,不必每次获取对象时都进行同步,只是第一次需要进行同步。

java23种模式之单例模式

时间: 2024-10-21 13:39:43

java23种模式之单例模式的相关文章

IOS设计模式之一(MVC模式,单例模式)

本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq)翻译,如果你发现有什么翻译错误,请与我联系谢谢. iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不会太关注它. 在软件设计领域,设计模式是对通用问题

Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工作,以达到本地和Java的统一,但是就这点而言就相当的消耗资源,所以就Java程序员需要不断的去优化自己的代码.今天所研究的单例模式就是在这样的条件下产生的, 所谓单例模式,就是只有一个实例,在堆里面只有一个.假如我们的实例,就需要一个,但是会多次用到,这样的话就会出现很尴尬的问题. 比如: Win

java设计模式 -------- 创建模式 之 单例模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 单例模式也是创建模式中的一种. 单例模式: 所谓的单例模式,即单一的实例,保证类在内在中只有一个对象. 举例: windows的打印服务,网络计数器 应用: 线程池,数据库连接池,Runtime 在应用单例模式前,先来看一个例子. Student.java public class Student { } StudentTest.java public class Studen

php 常用五种模式

/* 设计模式之单例模式 $_instance 必须声明为静态的私有变量 构造函数必须声明为私有,防止外部程序 new 类从而失去单例模式的意义 getInstance() 方法必须设置为公有的,必须调用此方法以返回实例的一个引用 :: 操作符只能访问静态变量和函数 new 对象会消耗内存 使用场景:最常用的地方是数据库连接 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用 [单例模式适用场景] 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 2.当这个唯一实例应该是

工厂模式,单例模式

工厂模式: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication1{ 设计模式:工厂模式,单例模式 <大话设计模式> 计算器 class JiSuanQi { private int a; public int A { get { return a; } set { a

【javascript设计模式】构造器模式、模块模式、单例模式

构造器模式(Constructor) 构造器模式是学习js最早接触的一种,实现主要如下: 1 function myObject(name){ 2 this.name = name; 3 } 4 5 myObect.propotype = function sayName(){ 6 alert(this.name); 7 } 使用的时候需要new一个对象. 1 var myObj = new myObject('hello'); 2 myObj.sayName(); 模块模式(Module) 模

.NET责任链模式(混合单例模式,模板方法模式)-----制作与扩展能力验证

.NET责任链模式.单例模式.模板方法模式混用 前言 哇,看到题目挺长的,这个组合型的东西,到底能干啥呢?本篇文章来一起琢磨琢磨,这两天为了团队的软件赶工,我负责的那一块叫:插件管理器.我们团队的成员用的语言还是挺分散的,本人C#,队长VB.NET,还有其他成员写易语言等,系统的功能插件是我们分开写的,各自用各自的喜欢的语言写各个功能模块的插件,最后用我开发的插件管理器把所有的插件整合到一起.这让我很头疼啊,一个C#版的插件,一个VB.NET版的插件,一个易语言的插件,如果有新成员加入,又来个P

java23种设计模式提纲

设计模式的六大原则: 1.单一职责原则 There should never be more than one reason for a class to change. 2.接口隔离原则 Clients should not be forced to depend upon interfaces that they don't use. The dependency of one class to another one should depend on the smallest possib

java23种设计模式详解(转)

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