java设计模式--单利

来源:互联网 发布:unity3d创建场景 编辑:程序博客网 时间:2024/05/26 12:53

看了不少博客,今天总结一下实际使用中用的。

这里明确,单利存在线程安全,不讨论为什么有这个问题(自己写个多线程测测就知道)

这里不讨论懒汉模式。(估计面试的时候都背过。。)

这里不讨论普通的恶汉模式和双重锁模式(后面备注一下即可)

这里讨论。。。

1.用静态内部类实现的单利和枚举实现的单利

a.静态内部类的实现:

package com.practice.shejimoshi;import java.util.Properties;/** * 设计模式:单利模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 * <p/> * <p/> * Created by guojiangjiang on 2017/2/9. */public class SingltonTest {    private static String path = "";    private static Properties properties;    //私有化构造方法    private SingltonTest(String path){        properties = readConfig(path);    }    //定义静态内部类    public static class SingltonHolder {        //静态初始化,由jvm保证线程安全        public static SingltonTest singltonTest = new SingltonTest(path);    }    //提供获取对象的入口    public static SingltonTest getInstance(String path) {        SingltonTest.path = path;        return SingltonHolder.singltonTest;    }    //读取配置文件    private Properties readConfig(String path) {        try {            System.out.println("读取了 [" + path + "]下的配置文件...");        } catch (Exception e) {            e.printStackTrace();        }        return new Properties(null);// 只是测试,实际开发中返回真实properties对象    }    public Properties getProperties() {        return properties;    }}

demo:

package com.practice.shejimoshi;import java.util.Properties;/** * Created by guojiangjiang on 2017/2/9. */public class MainTest {    public static void main(String[] args) {        Properties sin = SingltonTest.getInstance("classpath:config.properties").getProperties();        for (int i = 0; i < 3; i++) {            System.out.println(sin);        }        //EnumSingltonTest em = EnumSingltonTest.uniquInstance;    }}

b.枚举的实现方式:

package com.practice.shejimoshi;/** * Created by guojiangjiang on 2017/2/9. */public enum EnumSingltonTest {    /**     * 定义一个枚举的元素,它就代表了Singleton的一个实例     */    uniquInstance;        private EnumSingltonTest() {    }    //读取配置文件    public String readConfig(String path) {        try {            System.out.println("读取了 [" + path + "]下的配置文件...");        } catch (Exception e) {            e.printStackTrace();        }        return "files";    }}

demo:

package com.practice.shejimoshi;import java.util.Properties;/** * Created by guojiangjiang on 2017/2/9. */public class MainTest {    public static void main(String[] args) {    /*    Properties sin = SingltonTest.getInstance("classpath:config.properties").getProperties();        for (int i = 0; i < 3; i++) {            System.out.println(sin);        }*/        EnumSingltonTest em = EnumSingltonTest.uniquInstance;    }}


2.备注双重锁的单利(扒拉博客的)

https://my.oschina.net/xianggao/blog/616385

0 0
原创粉丝点击