`

Java与模式之单例模式

阅读更多

单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。

可分为eager模式,示例代码如下:

class EagerSingleton{
     private static final EagerSingleton m_instance = new EagerSingleton();
     private EagerSingleton(){}
     public static EagerSingleton getInstance(){
         return m_instance;
     }
}

和 lazy模式,示例代码如下:

class LazySingleton{
     private static LazySingleton m_instance = null;
     private LazySingleton(){}
     public synchronized static getInstance(){
        if(m_instance == null){
               m_instance = new LazySingleton();
        }
        return m_instance;
     }
}

 java源码中,Runtime.getRuntime()就是单例的一个例子。

 

单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton).

 

多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。

示例代码如下:

class Multiton{
     private final int INSTANCE_SIZE = 10;
     private static Map instances = new HashMap(INSTANCE_SIZE);
     private String name;
     private Multiton(){}
     private Multiton(String name){
          this.name = name;
     }
     public synchronized static getInstance(String name){
            if(instances.containsKey(name)){
                 return instances.get(name);
            }
            else{
                 ins = new Multiton(name);
                 instances.put(name, ins);
                 return ins;
            }
     }
}

 

一个实用的例子就是KeyGenerator, 示例代码如下:

class KeyGenerator{
     private final int POOL_SIZE = 20;
     private static Map instances = new HashMap(16);
     private KeyInfo keyinfo;
     private KeyGenerator(){}
     private KeyGenerator(String keyName){
          this.keyinfo = new KeyInfo(POOL_SIZE, keyName);
     }
     public synchronized static getInstance(String keyName){
            if(instances.containsKey(keyName)){
                 return (KeyGenerator)instances.get(keyName);
            }
            else{
                 keyGen = new KeyGenerator(keyName);
                 instances.put(name, keyGen);
                 return keyGen;
            }
     }
     public synzhronized int getNextKey(){
           return keyinfo.getNextKey();
     }
 }

 其实,用单例模式也照样可以实现KeyGenerator, 无非是把聚集里的KeyGenerator实例换成KeyInfo示例而已。

无论是用单例模式还是多例模式,都可以做到同样的一件事情。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics