单例模式

单例模式是Java中最常用的模式之一,它通过阻止外部实例化和修改,来控制所创建的对象的数量。这个概念可以被推广到仅有一个对象能更高效运行的系统,或者限制对象实例化为特定的数目的系统中。例如:

  1. 私有构造函数 - 其他类不能实例化一个新的对象。
  2. 私有化引用 - 不能进行外部修改。
  3. 公有静态方法是唯一可以获得对象的方式

一个国家只能有一位总统(可能在正常情况下)。所以不管任何时候我们需要一位总统,使用AmericaPresident就能返回一个。getPresident()方法将确保只有一个总统对象被创建。否者,就不妙了

 1 public class AmericaPresident {
 2 
 3     private AmericaPresident() {}
 4 
 5     private static final AmericaPresident thePresident=new AmericaPresident();
 6 
 7     public static AmericaPresident getPresident(){
 8         return thePresident;
 9     }
10 }
单例模式示例代码

单例模式的实现

1.双重校验锁,在当前的内存模式中无效

class Singleton{
  private volatile static Singleton instance;    
  private Singleton(){}
  public static Singleton getInstance(){
     if(instance == null){
       synchronized(Singleton.class){
         if(instance == null){
              instance = new Singleton();
           }  
        }
    }   return instance; } }

2.静态内部类。加载时不会初始化静态变量 INSTANCE 因为没有主动调用,达到了懒加载的效果

class Singleton{
  private Singleton(){}
  private static class SingletonHolder{
    private final static Singleton INSTANCE = new Singleton();
  }
  public static Singleton getInstance(){
    return SingletonHolder.INSTANCE;
  }
}

3.饿汉

class Singleton{
  private static Singleton instance = new Singleton();
  private Singleton(){}
  public static Singleton getInstance(){
    return instance;
  }
}

4.懒汉(常用模式)

class Singleton{
  private static Singleton instance;
  private Singleton(){}
  public static Singleton getInstance(){
    if(instance == null){
      instance = new Singleton();
    }
    return instance;
  }
}

 

  

单例模式在Java标准库中的使用

java.lang.Runtime#getRuntime() 是Java 标准库中常用的方法,它返回与当前Java应用关联的运行时对象。

下面是getRunTime() 的一个简单例子,它在windows系统上读取一个网页。

 1 Process p = Runtime.getRuntime().exec(
 2         "C:/windows/system32/ping.exe programcreek.com");
 3 
 4 //get process input stream and put it to buffered reader
 5 BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
 6 String line;
 7 while ((line = input.readLine()) != null) {
 8     System.out.println(line);
 9 }
10 input.close();

输出结果

Pinging programcreek.com [198.71.49.96] with 32 bytes of data:
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Reply from 198.71.49.96: bytes=32 time=52ms TTL=47
Reply from 198.71.49.96: bytes=32 time=53ms TTL=47
Ping statistics for 198.71.49.96:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 52ms, Maximum = 53ms, Average = 52ms

 

 

posted on 2013-11-27 17:07  亦諾  阅读(111)  评论(0编辑  收藏  举报

导航