设计模式【单例模式】

来源:互联网 发布:淘宝商家规则 编辑:程序博客网 时间:2024/06/05 22:57

       Java中单例模式是一种常见的设计模式,单例模式分为:饿汉式单例模式、懒汉式单例模式、登记式单例模式、枚举式单例模式。作为对象的常见模式的单例模式,确保某一类只有一个实例,而且自行实例化并向整个系统提供这个实例。
       单例模式的特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

       举例说明:在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
【转载使用,请注明出处:http://blog.csdn.net/mahoking

饿汉式单例模式用例:

/** * 饿汉式单例类 * @author Mahc * */public class EagerSingleton {private static EagerSingleton instance = new EagerSingleton();/** * 私有的构造方法/构造函数 */private EagerSingleton(){}/** * 静态工厂方法 * @return instance */public static EagerSingleton getInstance(){return instance;}}

         饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,在未使用时,就已经创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
 懒汉式单例模式用例:

/** * 懒汉式单例类 * @author Mahc * */public class LazySingleton {private static LazySingleton instance = null;/** * 私有的构造方法/构造函数 */private LazySingleton(){}/** * 静态工厂方法 * 由于懒汉式的实现是线程安全的 ,所以使用了   synchronized * @return instance */public synchronized static LazySingleton getInstance() {if(instance == null){instance = new LazySingleton();}return instance;}}

        懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间。
       由于懒汉式的实现是线程安全的,这样会降低整个访问的速度,而且每次都要判断,所以需要更好的实现方式。
登记式单例模式用例:

/** * 登记式单例类 * 类似Spring里面的方法,将类名注册,下次从里面直接获取。  * @author Mahc *  */public class RegisterSingleton {private static Map<String, RegisterSingleton> map = new HashMap<String, RegisterSingleton>();static{RegisterSingleton singleton = new RegisterSingleton();map.put(singleton.getClass().getName(), singleton);}protected RegisterSingleton(){}/** * 静态工厂方法,返还此类惟一的实例   * @param name * @return */public static RegisterSingleton getInstence(String name){if(name == null){name = RegisterSingleton.class.getName();}if(map.get(name) == null){try {map.put(name, (RegisterSingleton)Class.forName(name).newInstance());} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}return map.get(name);}}

           登记式单例模式,使用Class加载器,辅助Map对象将Singleton的name作为key值保存Value(Singleton的实例对象)。
本例使用枚举的关键字 enum 枚举式单例模式用例:

public enum EnumSingleton {/**     * 定义一个枚举的元素,它就代表了Singleton的一个实例。     * @author Mahc */uniqueInstance;}

测试各种样式的单例模式测试类:

public class TestSingleton {public static void main(String[] args) {//测试饿汉式模式EagerSingleton eagerSingleton01 = EagerSingleton.getInstance();EagerSingleton eagerSingleton02 = EagerSingleton.getInstance();if(eagerSingleton01 == eagerSingleton02){System.out.println("EagerSingleton\n" + true);}//测试懒汉式模式LazySingleton lazySingleton01 = LazySingleton.getInstance();LazySingleton lazySingleton02 = LazySingleton.getInstance();if(lazySingleton01 == lazySingleton02){System.out.println("LazySingleton\n" + true);}//测试登记式模式RegisterSingleton registerSingleton01 = RegisterSingleton.getInstence(null);RegisterSingleton registerSingleton02 = RegisterSingleton.getInstence(null);if(registerSingleton01 == registerSingleton02){System.out.println("RegisterSingleton\n" + true);}//枚举式模式EnumSingleton enumSingleton01 = EnumSingleton.uniqueInstance;EnumSingleton enumSingleton02 = EnumSingleton.uniqueInstance;if(enumSingleton01 == enumSingleton02){System.out.println("EnumSingleton\n" + true);}}}


【转载使用,请注明出处:http://blog.csdn.net/mahoking

 

1 0
原创粉丝点击