这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是
独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的对象:皇帝
  中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应用和昨天、前天的一样(过渡期的不考虑),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的单例模式。
  先看类图:
  

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

 package com.iadmob.singleton;

 /**
* @author http://www.cnblogs.com/initial-road/
* 中国的历史上一般都是一个朝代一个皇帝,有两个皇帝的话,必然要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.iadmob.singleton; /**
* @author http://www.cnblogs.com/initial-road/
* 大臣是天天要面见皇帝,今天见的皇帝和昨天的,前天不一样那就出问题了!
*/
@SuppressWarnings("all")
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的容器上后都创建了一个线程,每个线程都要创建同一个单例对象,怎么办?好,我们写一个通用的单例程序,然后

分析一下:

 package com.iadmob.singleton;

 /**
* @author http://www.cnblogs.com/initial-road/
* 通用的单例模式
*/
public class SingletonPattern {
private SingletonPattern singletonPattern = null; //限制住不能直接产生一个实例
private SingletonPattern(){ } public SingletonPattern getInstance(){
if(this.singletonPattern == null){
this.singletonPattern = new SingletonPattern();
}
return this.singletonPattern;
} }

  我们来看if条件那一部分,假如现在有两个线程A和线程B,线程A执行到this.singleton,Pattern = new SingletonPattern();正在申请内存分配,可能需要
0.001微妙,就在这0.001微妙之内,线程B执行到if(this.singletonPattern==null),你说这个时候这个判断条件是是true还是false?是true,那然后呢?

线程B也往下走,于是乎就在内存中就有两个Singleton的实例了,看看是不是出问题了?

  如果你这个单例是去那一个序号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这
才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:

 package com.iadmob.singleton;

 /**
* @author http://www.cnblogs.com/initial-road/
* 通用单例模式
*/
public class SingletonPattern {
private static final SingletonPattern singletonPattern = new SingletonPattern(); //限制住不能直接产生一个实例
private SingletonPattern1(){
} public synchronized static SingletonPattern getInstance(){
return singletonPattern;
} }

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

24种设计模式--单例模式【Singleton Pattern】的更多相关文章

  1. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  2. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  3. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  4. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  5. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  6. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  7. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  8. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  9. DP:***24种设计模式--转自刘伟

    转自于高人的文章:http://blog.csdn.net/lovelion/article/details/17517213 2012年-2013年,Sunny在CSDN技术博客中陆续发表了100多 ...

随机推荐

  1. 新型Web劫持技术

    该类新型Web劫持是利用script脚本实现的.在已知的案例中,黑客入侵了某地方门户网站,篡改了该网站的新闻页面,并向这些页面植入自己的广告.新闻及恶意代码.一旦用户从搜索结果页面点击进入被篡改过的新 ...

  2. Unity3d 真实的植物渲染

    好久没写shader了,有些生疏,刚弄了个植物shader,分享一下. 先上图片: 重点需要注意的是fragment shader的透明部分 需要如此声明 Tags{ "LightMode& ...

  3. IOS性能调优系列:使用Instruments动态分析内存泄漏

    硬广:<IOS性能调优系列>第二篇,持续更新,欢迎关注. 第一篇介绍了Analyze对App做静态分析,可以发现应用中的内存泄漏问题,对于有些内存泄漏情况通过静态分析无法解决的,可以通过动 ...

  4. request.setAttribute()用法

    小问题: JSP1代码 String [] test=new String[2]; test[0]="1"; test[1]="2"; request.setA ...

  5. Web移动端Fixed布局的解决方案

    移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况. 但是 fixed 元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题. 这篇文章里就提供一个简单的有 ...

  6. mapreduce 读写lzo文件

    1.读lzo文件 需要添加以下代码,并导入lzo相关的jar包  job.setInputFormatClass(LzoTextInputFormat.class); 2.写lzo文件 lzo格式默认 ...

  7. Scrapy运行报错解决方案

    最近在学习Scrapy框架,用博客记录一下遇到的错误的解决方案 时间: 2016-9-20 错误:ImportError: No module named items 原因:spiders下的.py文 ...

  8. SecondarySort 原理

    定义IntPair 以及 IntPair(first,second)的compareto,先比較first的大小,再比較second的大小 定义FirstPartitioner是为了让partitio ...

  9. linux下的僵尸进程处理SIGCHLD信号

    什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...

  10. 使用Partitioner实现输出到多个文件

    1.需求 按学生的年龄段,将数据输出到不同的文件.这里我们分为三个年龄段:小于等于20岁.大于20岁小于等于50岁和大于50岁 2.实现 1.编写Partitioner,代码如下 public sta ...