java设计模式(4):单例模式(Singleton)

单例模式又叫做单态模式或者单件模式。在 GOF 书中给出的定义为:保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来代表那些本质上具有唯一性的系统组件(或者叫做资源)。比如文件系统、资源管理器等等。


        单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在一定情况下灵活的改变对象的个数。那么怎么来实现单例模式呢?一个类的对象的产生是由类构造函数来完成的,如果想限制对象的产生,一个办法就是将构造函数变为私有的(至少是受保护的),使得外面的类不能通过引用来产生对象;同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。


        现在对单例模式有了大概的了解了吧,其实单例模式在实现上是非常简单的——只有一个角色,而客户则通过调用类方法来得到类的对象。

        

        单例模式可分为有状态的和无状态的。有状态的单例对象一般也是可变的单例对象,多个单态对象在一起就可以作为一个状态仓库一样向外提供服务。没有状态的单例对象也就是不变单例对象,仅用做提供工具函数。


       在单例模式的实现上有几种不同的方式,我在这里将一一讲解。先来看一种方式,它在《java 与模式》中被称为饿汉式。

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Singleton {  
  2.     //在自己内部定义自己一个实例  
  3.     //注意这是private 只供内部调用  
  4.     private static Singleton instance = new Singleton();  
  5.     //如上面所述,将构造函数设置为私有  
  6.     private Singleton(){  
  7.     }  
  8.     //静态工厂方法,提供了一个供外部访问得到对象的静态方法  
  9.     public static Singleton getInstance() {  
  10.       return instance;  
  11.     }  
  12. }  

下面这种方式被称为懒汉式:

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public class Singletion  
  2. {  
  3.     private static Singletion singletion ;  
  4.       
  5.     private Singletion()  
  6.     {  
  7.           
  8.     }  
  9.       
  10.     public static Singletion getInstance()  
  11.     {  
  12.         if(singletion == null)  
  13.         {  
  14.             singletion = new Singletion();  
  15.         }  
  16.         return singletion;  
  17.     }  
  18. }  

先让我们来比较一下这两种实现方式。


       首先他们的构造函数都是私有的,彻底断开了使用构造函数来得到类的实例的通道,但是这样也使得类失去了多态性(大概这就是为什么有人将这种模式称作单态模式)。


       在第二种方式中,对静态工厂方法进行了同步处理,原因很明显——为了防止多线程环境中产生多个实例;而在第一种方式中则不存在这种情况。

       

       在第二种方式中将类对自己的实例化延迟到第一次被引用的时候。而在第一种方式中则是在类被加载的时候实例化,这样多次加载会照成多次实例化。但是第二种方式由于使用了同步处理,在反应速度上要比第一种慢一些。


       在 《java 与模式》书中提到,就java 语言来说,第一种方式更符合java 语言本身的特点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值