设计模式学习笔记——单例模式

原文:http://blog.csdn.net/hackerain/article/details/7527691

定义:

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式的通用类图如下:


代码如下:

[java]  view plain copy
  1. public class Singleton {  
  2.     private static final Singleton singleton=new Singleton();  
  3.       
  4.     //私有的构造函数,限制产生多个对象  
  5.     private Singleton(){  
  6.         System.out.println("singleton is created");  
  7.     }  
  8.       
  9.     public static Singleton getInstance(){  
  10.         return singleton;  
  11.     }  
  12.       
  13.     public void doSomething(){  
  14.         System.out.println("Hello Singleton!");  
  15.     }  
  16. }  


这里需要注意几个地方:

1、要定义一个私有的静态的成员变量,并且在声明变量的时候就直接进行初始化,这样做是为了防止多线程操作而有可能出现的产生多个实例情况。

2、构造函数要定义成私有的,以限制产生多个对象。

3、要有一个静态的返回实例化后的成员变量的函数getInstance(),并且是公开的静态的,由类名进行调用。


单例模式的优点:

1、因为只有一个实例存在内存中,减少了内存的开支,特别是一个对象需要频繁的创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。

2、单例模式可以避免对资源的多重占用。

单例模式的缺点:

1、因为单例模式它要求“自行实例化”,所以一般没有接口,扩展很困难。

2、单例模式对测试是不利的,因为它没有接口,不能通过mock等方式虚拟一个对象。


单例模式的扩展:

如果要求一个类只产生两三个对象,该怎么办呢?来看一下类图:


代码如下:

[java]  view plain copy
  1. public class MutiSingleton {  
  2.       
  3.     //定义最多能产生的实例数量  
  4.     private static int maxNumOfSingleton=2;  
  5.       
  6.     //定义一个实例列表,存放生成的实例  
  7.     private static ArrayList<MutiSingleton> singletons=new ArrayList<MutiSingleton>();  
  8.       
  9.     //当前实例的序列号  
  10.     private static int countNumOfSingleton=0;  
  11.       
  12.     private MutiSingleton(){  
  13.           
  14.     }  
  15.       
  16.     //产生所有的实例  
  17.     static{  
  18.         for(int i=0;i<maxNumOfSingleton;i++){  
  19.             singletons.add(new MutiSingleton());  
  20.         }  
  21.     }  
  22.       
  23.     public static MutiSingleton getInstance(){  
  24.         Random random=new Random();  
  25.         countNumOfSingleton=random.nextInt(maxNumOfSingleton);  
  26.         return singletons.get(countNumOfSingleton);  
  27.     }  
  28. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值