`
yangguangfu
  • 浏览: 1531784 次
  • 性别: 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  
那个静态方法的输出永远一样,根本不能说明当前获得的实例是同一个

相关推荐

    设计模式——单例模式

    是http://blog.csdn.net/lxq_xsyu/article/category/1544127博客中java设计模式的源代码。下载前请先看《设计模式——单例模式》一文。

    java设计模式——单例模式

    今天给大家带来的是23种设计模式的第一种——单例模式。前天写的第一篇文章设计模式的七大原则,是我第一次写文章,目前看了浏览量,让我信心大增。文章有什么讲述方式不对的欢迎大家随时给我私信。24小时恭候!!...

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    design-pattern-java.pdf

    基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...

    深入浅出设计模式(中文版电子版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    深入浅出设计模式(中文版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

    Java性能调优实战——覆盖80%以上的Java应用调优场景

    模块四热点问题解答26讲单例模式:如何创建单一对象优化系统性能27讲原型模式与享元模式:提升系统性能的利器32讲MySQL调优之SQL语句:如何写出高性能SQL语句33讲MySQL调优之事务:高并发场景下的数据库事务调优34讲...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    软件设计模式大作业

    java设计模式期末大作业,运用了6种模式,包括简单工厂模式、工厂方法模式、单例模式、门面模式、策略模式、观察者模式,文档包括系统流程,系统类图,各个模式的子类图,源代码,实验截图。绝对完整.

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    设计模式——开发常用的设计模式梳理

    本文来自51cto,文章主要介绍了策略模式、观察者模式、装饰模式、单例模式以及饿汉模式等的相关内容。泛化=实现&gt;组合&gt;聚合&gt;关联&gt;依赖一个人(Person)可以买车(car)和房子(House),那么就可以称:Person类依赖于Car类...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    设计模式Demo

    针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰...

    java——让学员少走弯路

    Java的一些基本概念,Java的起源、为什么我们要学习Java语言,Java跨平台原理剖析;Java环境变量的配置,初学者常犯的问题,...数组的复制与排序,Runtime类与Process类,Class类与反射API,Runtime类与单例设计模式。

Global site tag (gtag.js) - Google Analytics