JAVA设计模式-Singleton

本文详细介绍了 Java 中 Singleton 设计模式的实现原理及其应用场景,通过示例代码展示了如何限制类仅生成一个实例,以及如何扩展该模式以限制实例数量。

一系列设计模式介绍:http://blog.youkuaiyun.com/vincentzhao2009/article/details/6185236

 近来一直在研究JAVA的设计模式,看了很多别人的文章和源码,自己也写了一些,算是有一些认识吧,我想要把这些想法都记录下来。23个设计模式算很多了,希望我能有时间,也有毅力能够坚持下来。下面就是第一个设计模式,Singleton。

 

      这个模式限制了使用这个模式的类只能生成一个对象。有一些对象其实我们完全只需要一个即可,如:线程池(threadpool)、缓存(cache)、注册表(registry)的对象、设备的驱动程序的对象等等。事实上,这些类的对象只能有一个实例,如果制造出多个实例,就会导致许多问题的产生,例如:程序的行为异常、资源的过量使用、产生不一致的结果等等。Java Singleton模式就为我们提供了这样实现的可能。是用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

 

     下面我就用代码来实现一个Singleton模式,当然这只是其中一种实现方法而已。

 

 

 

   

[java]  view plain copy
  1. public class Singleton {   
  2.     //构造函数为private,所以其它类(包括子类)无法调用构造函数来实例化这个类。  
  3.     private Singleton(){}     
  4.     //这个类中有一个成员变量的类型就是自身,它是stataic和private的,  
  5.     //表明这个类的这个变量只有这一份,并且只能在内部调用。  
  6.     private static Singleton instance = new Singleton();   
  7.     //这里提供了一个供外部访问本class的静态方法,可以直接访问   
  8.     public static Singleton getInstance() {   
  9.         return instance;   
  10.     }     
  11. }  

 

    然后是测试代码:

   

[java]  view plain copy
  1. public class Test{  
  2.     public static void main(String[] args){  
  3.         //使用方法  
  4.         Singleton singleton1;   
  5.         singleton1 = Singleton.getInstance();  
  6.         Singleton singleton2;   
  7.         singleton2 = Singleton.getInstance();  
  8.         System.out.println(singleton1.equals(singleton2));  
  9.     }  
  10. }  

 

 

    上面的代码的打印结果是true,证明了singleton1和singleton2指向了同一个对象。

 

    这里我想要提一下这个equals()方法,这个方法是没有被重载过的方法,因此,这个equals()方法比较的是两个对象的引用,引用这个词语类似于c/c++里的指针,所以说,equals()方法返回true,就意味着这是同一个对象。

 

    另外,我想提一下static这个关键字,它是Singleton模式的核心。

    1.Singleton类的成员变量instance被声明为staitc就意味着这个成员变量只有一份(而不是每个对象一份)。

    2.getInstance()这个方法是static的就是说,这个方法在Singleton这个类没有被实例化的时候就能使用。

    3.当Singleton这个类被加载的时候(是执行singleton1 = Singleton.getInstance();这句话的时候,注意不是这句话Singleton singleton1; ),这个类的静态成员变量instance被初始化(private static Singleton instance = new Singleton(); 这句话被执行),然后(注意是先初始化,再调用)调用getInstance()方法返回这个成员变量instance,当执行singleton2 = Singleton.getInstance();这句话的时候,因为instance被声明成static,因此,private static Singleton instance = new Singleton(); 不会被(注意是不会被)再次调用,而是直接调用getInstance()方法,返回同一个instance。这样就实现了Singleton这个模式。

 

 

    下面是一些扩展,既然我们能够限制类只能生成一个对象,那么就能限制它最多生成指定数量个对象,代码如下:

 

   

[java]  view plain copy
  1. public class Singleton {   
  2.     private Singleton(){}   
  3.     private static int count = 0;   
  4.     public synchronized static Singleton getInstance() {   
  5.         if(count < 10){  
  6.             count++;  
  7.             return new Singleton();   
  8.         }else{  
  9.             return null;  
  10.         }         
  11.     }   
  12.     public static void main(String[] args){  
  13.         //使用方法  
  14.         for(int i = 0; i<15; i++){  
  15.             Singleton singleton = Singleton.getInstance();   
  16.             System.out.println(singleton);  
  17.         }  
  18.     }  
  19. }   

 

    这个类只能生成10个对象,就不解释了,你们懂的。

 

    预告:下一个是工厂模式,工厂模式一共分为三种,下期会详细介绍。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值