设计模式之一 ------------单例模式

来源:互联网 发布:棉被芯什么牌子好 知乎 编辑:程序博客网 时间:2024/06/05 14:23

单例模式—懒汉式

package com.penlei.single;/** * 单例的懒汉模式 * @author penglei */public class SingletonOne {/** * 提前创建单例的唯一实例 */     private static SingletonOne singletonOne = new SingletonOne();  //私有的构造方法   private SingletonOne(){   }   public static SingletonOne getSingletonOne(){         return singletonOne;   }}

单例模式—饿汉式

package com.penlei.single;/** * 单例的饿汉模式 * @author penglei */public class SingletonTwo {/** *设置实例为空,用到实例时再创建  */  private static SingletonTwo singletonTwo = null;  //私有的构造方法private SingletonTwo(){}public static SingletonTwo getSingletonTwo(){    //第一次判断singletonOne是否为空 用来提高执行的效率    if(singletonTwo == null){     //对对象加锁,解决同步问题        synchronized (singletonTwo .class)         {                                                    if(singletonTwo == null){           //第二次判断singletonTwo 是否为空,用来实现同步功能          singletonTwo = new SingletonTwo();          }         }    }     return singletonTwo;}}

单例模式—–登记式

  登记式单例类是为了克服饿汉式单例类和懒汉式单例类不可继承的缺点而设计的。 package com.penlei.single;import java.util.HashMap;/** * 登记式单例 * @author penglei */public class RegSingleton {    private static HashMap registry = new HashMap();    /**     * 静态代码块,会优于主方法执行,且会优于构造方法,而且不管产生多少对象,静态代码块只执行一次。     */    static{        RegSingleton regSingleton  = new RegSingleton();        registry.put(regSingleton.getClass().getName(),                        regSingleton);    }    /**     * 构造方法为保护类型,可以进行继承     */    protected RegSingleton(){    }    public static RegSingleton getInstance(String name) {        if(name == null){            name = "com.penlei.single.RegSingleton" ;        }        if(registry.get(name) == null){                try {                     registry.put(name, Class.forName(name).newInstance());                } catch (InstantiationException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IllegalAccessException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (ClassNotFoundException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }        }        return (RegSingleton) registry.get(name);    }}
0 0
原创粉丝点击