JAVA设计模式之单例模式(创建型)

来源:互联网 发布:cnc编程软件排行榜 编辑:程序博客网 时间:2024/05/16 01:55

1,饿汉式
优点:线程安全,调用效率高

package com.imust.gof.demo;/** * 测试饿汉式单例:特点:线程安全,(天然的线程安全模式) * 设计模式 * 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式 * 结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享原模式,代理模式 * 行为型模式:模版方法模式,命令模式,迭代模式,观察器模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式 *  * @author Zhang.Zhi.Fei 2017年9月5日 * */public class singletonDemo1 {    private static singletonDemo1 instance = new singletonDemo1();//类初始化时候立即加载    private singletonDemo1(){}    public static singletonDemo1 getInstance(){        return instance;    }}

懒汉式:
优点,调用效率低,方法同步

package com.imust.gof.demo;/** *懒汉式    不初始化,延迟加载,真正用的时候才加载 * 设计模式 * 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式 * 结构型模式:适配器模式,桥接模式,装饰模式,组合模式,外观模式,享原模式,代理模式 * 行为型模式:模版方法模式,命令模式,迭代模式,观察器模式,中介者模式,备忘录模式,解释器模式,状态模式,策略模式,职责链模式,访问者模式 *  * @author Zhang.Zhi.Fei 2017年9月5日 * */public class singletonDemo2 {    private static singletonDemo2 instance =null;//类初始化时候立即加载    private singletonDemo2(){}    //调用效率低,方法同步    public static synchronized singletonDemo2 getInstance(){        if(instance == null){            instance = new singletonDemo2();        }        return instance;    }}

静态内部类实现单例模式

package com.imust.gof.demo;/** * 静态内部类实现方式(也是一种懒加载方式) *  * -- 外部类没有static属性,则不会像饿汉式那样立即加载对象 * -- 只有真正调用getinstance(),才会加载静态内部类,加载类时是线程安全的。instance是static final * 类型,保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性 * -- 兼备了并发高效调用和延迟加载的优势 *  *  * @author Zhang.Zhi.Fei 2017年9月5日 * */public class SingletonDemo04 {    private static class SingletonClassInstance{        private static final SingletonDemo04 instance = new SingletonDemo04();    }    public static SingletonDemo04 getInstance(){        return SingletonClassInstance.instance;    }    private SingletonDemo04(){}}

枚举类实现单例模式

package com.imust.gof.demo;/** * 测试枚举实现单例模式  (没有懒加载,演示加载) * @author Zhang.Zhi.Fei 2017年9月5日 * */public enum SingletonDemo5 {    //这个枚举元素,本身就是单例    INSTANCE;    //添加自己需要的操作    public void SingletonOperation(){    }}

以懒汉式单例为例子测试防止序列化破解单例

package com.imust.gof.demo;import java.io.Serializable;/** * 测试懒汉式单例模式(如何防止反射和反序列化) * @author Zhang.Zhi.Fei 2017年9月5日 * */public class SingletonDemo6 implements Serializable{    private static SingletonDemo6 instance;    private SingletonDemo6(){        if(instance != null){            **//为了防止被反射破解            throw new RuntimeException();**        }    }    public static synchronized SingletonDemo6 getInstances(){        if(instance == null){            instance = new SingletonDemo6();        }        return instance;    }}
原创粉丝点击