JAVA设计模式之单态设计模式例子

转载 2012年03月25日 15:18:04

单态设计模式是使用很广泛的一个设计模式,这个设计模式的主要目的是通过一定的技术手段来保证在整个软件系统中只存在某个类的一个实例对象。本文会通过一个Singleton(借鉴别人的)的例子来说明单态设计模式。

Singleton的最初版本

这里直接给出Singleton的代码,我们就叫这个版本为1.0版。

//version 1.0
public class Singleton {
 private static final Singleton singleton = null;
 private Singleton() { }
 public static Singleton getInstance() {
  if(singleton == null) {
   singleton = new Singleton();
  }
  return singleton;
 }
}

对上面这个类做个简要的说明:

1.构造函数是private,这主要是防止在这个类的外部产生该类的实例对象。

2.通过一个static的方法getInstance,取得其唯一的实例对象。

Singleton的实际版本

或许你认为这样的代码就达到我们的目的了,其实上面的程序存在着严重的问题,在多线程的情况下,如果有多个线程同时调用getInstance方法,那么可能就会有多个线程同时通过(singleton == null)的检查,于是,多个实例对象被创建出来了,并且有可能造成内存泄露等问题。所以,我们需要通过线程间的同步来解决上面的问题,修改程序代码,升级为1.1版。

//version 1.1
public class Singleton {
 private static final Singleton singleton = null;
 private Singleton() { }
 public static Singleton getInstance() {
  if(singleton == null) {
   synchronized(Singleton.class) { //静态方法的同步锁为当前类的字节码
    singleton = new Singleton();
   }
  }
  return singleton;
 }
}

虽然上面的程序中通过synchronized实现了线程间的同步,但是还是存在问题,前面说过的,有可能多个线程同时通过(singleton == null)的条件检查(因为它们并行执行),这样synchronized方法就将多个并行执行的线程编程了串行执行的线程,

一个一个去new,从而得到多个Singleton类的实例对象!看来,我们还得把if(singleton == null)也同步了,升级代码得1.2版。

//version 1.2
public class Singleton {
 private static final Singleton singleton = null;
 private Singleton() { }
 public static Singleton getInstance() {
   synchronized(Singleton.class) {
    if(singleton == null) {
     singleton = new Singleton();
    }
  }
  return singleton;
 }
}

至此,我们已经解决了多个线程间的同步问题,保证了在整个的软件系统中只有一个Singleton的实例对象。然而,还是有一点小问题,我们本来只想同步new这个操作,然而现在进入getInstance的每个线程都同步了。在单态设计模式中只要求创建一个对象,其余的操作都是读取那个对象,不需要同步。所以上面1.2版中的代码就会影响程序性能,因此,我们还得改,在线程同步之前加上if(singleton == null),如果对象已经创建,就不需要在同步线程了,升级程序得到1.3版。

//version 1.3
public class Singleton {
 private static final Singleton singleton = null;
 private Singleton() { }
 public static Singleton getInstance() {
   if(singleton == null) {
    synchronized(Singleton.class) {
    if(singleton == null) {
     singleton = new Singleton();
    }
   }
  }
  return singleton;
 }
}
到此,我们已经写出了一个很不错的单态设计模式的例子。希望对大家有所帮助。

 

JAVA设计模式---单态模式理解

前言何为单态模式? 在一个系统中,JVM中,只能存在有一个对象的实例,所有程序的处理都只能调用这一个对象完成相关逻辑操作,单态模式有点在于减少了new关键字的调用,实例的初始化,节省了系统内存开销。...
  • zhang6622056
  • zhang6622056
  • 2016年09月21日 18:13
  • 956

JAVA设计模式初探之组合模式

先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”    就拿剪发办卡的事情来分析一下吧。    首先,一张卡可...
  • jason0539
  • jason0539
  • 2014年03月31日 08:40
  • 22820

读秦小波《设计模式之禅》 -- 工厂模式

设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法。      个人感觉《设计模式之禅》这本书中讲解的非常具体,每个模式都配...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2014年12月25日 08:36
  • 2734

Java设计模式(五) 原型模式详解

在开发过程中,有时会遇到为一个类创建多个实例的情况,这些实例内部成员往往完全相同或有细微的差异,而且实例的创建开销比较大或者需要输入较多参数,如果能通过复制一个已创建的对象实例来重复创建多个相同的对象...
  • u013916933
  • u013916933
  • 2016年06月04日 16:22
  • 3166

java设计模式之美

设计模式的概述设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。我们在项...
  • li741350149
  • li741350149
  • 2016年12月14日 08:23
  • 483

设计模式之禅学习笔记--策略模式

一、定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换(实现相同的接口)。 二、通用类图 策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握。 1:C...
  • xiang912
  • xiang912
  • 2015年05月14日 23:22
  • 617

Java设计模式之—静态代理和动态代理

代理从字面意思来看就是,替代XX去做某事,在我们的程序中,一般替代实际对象去进行操作,扮演着中间人的角色: 客户端 –> 业务类 客户端 –> 代理 –>业务类(代理) 代理接口int...
  • jeffleo
  • jeffleo
  • 2016年08月17日 00:08
  • 650

java设计模式——单态设计模式

//单例(用例,对象)class Demo{  public static void main(String[] args)   {       Bank b=Bank.bank;//通过类名调用st...
  • fzzlxc
  • fzzlxc
  • 2009年08月18日 12:33
  • 167

Java 单态设计模式

单态设计模式的实现有两种方式 : (1)、第一种形式:定义一个类,它的构造函数为private , 它有一个静态实例对象,并且此对象访问范围被设置为private , 通过 getInstance ...
  • xczzmn
  • xczzmn
  • 2011年08月27日 09:54
  • 544

JAVA单态设计模式

首先要说:  构造方法私有化,类的封装性不光体现在对属性的封装上,实际上方法也可以封装,当构造方法被私有化(封装),一个类的构造方法私有化之后,则只能从其类的内部取得实例化对象,那么此时要考虑的问题...
  • qq_27862335
  • qq_27862335
  • 2017年02月16日 09:43
  • 111
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA设计模式之单态设计模式例子
举报原因:
原因补充:

(最多只允许输入30个字)