`
yangguangfu
  • 浏览: 1539627 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式之——单例模式

阅读更多

java设计模式之——单例模式

1,什么是单例模式?

单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。

 

2,单例模式适合场景?

    单例模式适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统,它们都是原型的例子。典型的情况是,那些对象的类型被遍及一个软件系统 的不同对象访问,因此需要一个全局的访问指针,这便是众所周知的单例模式的应用。当然这只有在你确信你不再需要任何多于一个的实例的情况下。
单例模式的用意在于前一段中所关心的。通过单例模式你可以:

 

3,单例模式特点:

 
确保一个类只有一个实例被建立
提供了一个对对象的全局访问指针
在不影响单例类的客户端的情况下允许将来有多个实例 。

 

 

4,应用场景举例:

我们举个比较难复制的对象:皇帝

   中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应该是昨天、前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的单例模式。

 

先看看类图:

 

然后我们看程序实现,先定义一个皇帝:

package com.yangguangfu.singleton;
/**
 * 
 * @author 阿福(trygf521@126.com)<br>
 *中国的历史上都是一个朝代一个皇帝,有两个皇帝的话,必然要PK一个皇帝出来
 */
public class Emperor {
	//定义一个皇帝放在那里,然后给这个皇帝起个名字
	private static Emperor emperor = null;
	
	private Emperor(){
		//世俗和道德的约束你,目的就不让你产生第二个皇帝
	}
	
	public static Emperor getInstance(){
		if(emperor==null){
			emperor = new Emperor();
		}
		return emperor;
	}
	
	//皇帝叫什么名字呀
	public static void emperorInfo(){
		System.out.println("我是皇帝某某某...阿福");
	}

}
 

然后定义大臣

package com.yangguangfu.singleton;

public class Minister {
	public static void main(String[] args) {
		//第一天
		Emperor  emperor1 = Emperor.getInstance();
		//第一天见的皇帝叫什么名字呢?
		emperor1.emperorInfo();
		
		//第二天
		Emperor  emperor2 = Emperor.getInstance();
		//第二天见的皇帝叫什么名字呢?
		emperor2.emperorInfo();
		
		//第三天
		Emperor  emperor3 = Emperor.getInstance();
		//第三天见的皇帝叫什么名字呢?
		emperor3.emperorInfo();
		
		//三天见的皇帝都是同一个人,荣幸吧,呵呵。
	}

}

  看到没,大臣天天见到的都是同一个皇帝,不会产生混乱情况,反正都是一个皇帝,是好是坏就这一个,只要提到皇帝,大家都知道指的的谁,清晰,而又明确。问题是通常情况,还有个例外的,如果同一个时期同一个朝代有两个皇帝,怎么办?

      单例模式很简单,就是在构造函数中多加了一个构造函数,访问权限是private的就可以了,这个模式是简单,但是简单中透着风险,风险?什么风险?在一个B/S项目中,每个HTTP Request请求道J2EE的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办才好呢?好,我们写一个通用的单例程序,然后分析一下:

 

我们看看皇帝中的:if(emperor==null){ emperor = new Emperor();   }

 我们来看看上面这段代码,假如现在有两个线程A线程和B线程,线程A执行到emperor = new Emperor();,正在申请内存分配,可能需要0.001毫秒,就在这0.001毫秒之内,线程B执行if(emperor==null),你说这个时候判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个皇帝了,看看是不是出问题了?如果你是个单例去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上看不出上面问题,这才是要命的!应为有这个情况基本上你是重视不了的,不寒而栗吧,那怎么修改?有多重方案,我就说一种,能简单的、彻底解决问题的方案:

package com.yangguangfu.singleton;
/**
 * 
 * @author 阿福(trygf521@126.com)<br>
 *中国的历史上都是一个朝代一个皇帝,有两个皇帝的话,必然要PK一个皇帝出来
 */
public class EmperorNew {
	//定义一个皇帝放在那里,然后给这个皇帝起个名字
	private static final EmperorNew emperorNew = new EmperorNew();;
	
	private EmperorNew(){
		//世俗和道德的约束你,目的就不让你产生第二个皇帝
	}
	
	public  synchronized static  EmperorNew getInstance(){
		
		return emperorNew;
	}
	
	//皇帝叫什么名字呀
	public static void emperorInfo(){
		System.out.println("我是皇帝某某某...阿福");
	}

}
 

直接new一个对象传递给类的成员变量emperorNew,你要的时候getInstance()直接返回给你,问题解决!欧啦!

 

  • Singleton.zip (6.3 KB)
  • 描述: 单例模式源代码
  • 下载次数: 29
  • 描述: 单例模式
  • 大小: 46.8 KB
0
2
分享到:
评论
1 楼 wordedit 2012-04-28  
那个静态方法的输出永远一样,根本不能说明当前获得的实例是同一个

相关推荐

    设计模式——单例模式

    **设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...

    设计模式实现——单例模式

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。单例模式的核心在于...

    设计模式——单例模式(懒汉模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类在任何情况下都只有一个实例存在。这个模式在很多场景下非常有用,例如控制全局资源、管理配置信息等。本文将详细探讨单例模式的懒汉式实现,并结合源码进行解析...

    java设计模式——单例模式

    【Java设计模式——单例模式】 单例模式是一种常见的软件设计模式,它的核心思想是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式主要用于控制类的实例化过程,减少系统资源的消耗,提高系统...

    java设计模式-单例.pdf

    ### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...

    设计模式之单例模式Java实现和类设计图

    本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...

    设计模式-单例模式

    **设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...

    三种工厂设计模式和两种单例模式

    在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...

    Java设计模式源代码——自己看pdf写的

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可复用性。在这个压缩包文件“DesignPatterns”中,很可能包含了各种Java设计模式的源代码实现。...

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    JAVA设计模式.chm

    本资源“JAVA设计模式.chm”聚焦于一种重要的设计模式——工厂模式。工厂模式是面向对象设计中的一种经典模式,它在Java程序中扮演着核心角色。 工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    java 设计模式幽默解读

    "大牛解读Java设计模式.pdf"这本书籍,作为这个主题的载体,很可能是由资深专家撰写,用生动的语言和实例帮助读者理解抽象的设计概念,从而提升他们的编程技能。无论你是初学者还是有经验的开发者,都能从中受益匪浅...

Global site tag (gtag.js) - Google Analytics