单例模式

    xiaoxiao2024-12-28  62

    保证一个类只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。

    应用: 多线程环境,共享同一资源或对象。 在整个程序空间使用全局变量,共享资源。 大规模系统,为了性能考虑。

    注意 享有特权的客户端可以借助AccessibleObject.setAccessible方法,通过反射机制调用私有构造器。如果需要抵御这种攻击,可以修改构造器,让他在被要求创建第二个实例的时候抛出异常。

    /** 懒汉式 在多线程下可能有多个实例 */

    public class FullPerson { private String name; private static FullPerson fullPerson; public String getName() { return name; } public void setName(String name) { this.name = name; } //私有构造函数 private FullPerson(){ } //提供一个全局的静态方法 public static FullPerson getPerson(){ if(fullPerson == null){ return new FullPerson(); }else { return fullPerson; } } }

    /** 饿汉式 */

    public class HungryPerson { public static final HungryPerson PERSON= new HungryPerson(); private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //私有构造函数 private HungryPerson(){ } //提供一个全局的静态方法 public static HungryPerson getPerson(){ return PERSON; } }

    /** 双重检查 **/

    public class DoubleLockPerson { private static volatile DoubleLockPerson doubleLockPerson; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } private DoubleLockPerson(){ } public static DoubleLockPerson getDoubleLockPerson(){ if (doubleLockPerson==null){ synchronized (doubleLockPerson){ if(doubleLockPerson == null) { doubleLockPerson = new DoubleLockPerson();//将这个执行一次的锁住 } } } return doubleLockPerson; } }

    /** 登记式单例 **/

    package com.tfj.pattern; import java.util.HashMap; import java.util.Map; /** * 类似Spring里面的方法,将类名注册,下次从里面直接获取。 * * @author Jacksile */ public class Singleton { private static Map<String, Singleton> map = new HashMap<String, Singleton>(); static { Singleton singleton = new Singleton(); map.put(singleton.getClass().getName(), singleton); } // 保护的默认构造子 protected Singleton() { } // 静态工厂方法,返还此类惟一的实例 public static Singleton getInstance(String name) { if (name == null) { name = Singleton.class.getName(); System.out.println("name == null" + "--->name=" + name); } if (map.get(name) == null) { try { map.put(name, (Singleton) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } // 一个示意性的商业方法 public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) { Singleton singleton = Singleton.getInstance(null); System.out.println(singleton.about()); } }

    单元素枚举类

    enum SingletonC implements Serializable { INSTANCE; private String field; public String getField() { return field; } public void setField(String field) { this.field = field; } } //使用 SingletonC s = SingletonC .INSTANCE;
    最新回复(0)