设计模式 之 单例模式解析

    xiaoxiao2021-04-15  268

    预计阅读时间:8 分钟

    1、单例模式的定义

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式结构图如下所示:

    Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例

    在Java中,单例模式的实现又分为两种,一种称为懒汉式,一种称为饿汉式,其实就是在具体创建对象实例的处理上,有不同的实现方式。

    懒汉式单例实现的示例

    public class Singleton { // 定义一个变量来存储创建好的类实例 private volatile static Singleton uniqueInstance = null; // 私有化构造方法,好在内部控制创建实例的数目 private Singleton(){} // 提供一个全局访问点,为客户端提供类实例 public static synchronized Singleton getInstance(){ if(uniqueInstance == null) { synchronized(Singleton.class) { if(uniqueInstance == null) { uniqueInstance = new Singleton(); } } } //如果有值,那就直接使用 return uniqueInstance; } // 示意方法,单例可以有自己的操作 public void singletonOperation(){ //功能处理 } // 示意属性,单例可以有自己的属性 private String singletonData; // 示意方法,让外部通过这些方法来访问属性的值 public String getSingletonData(){ return singletonData; } }

    饿汉式单例实现的示例

    public class Singleton { private static Singleton uniqueInstance = new Singleton(); // 私有化构造方法,好在内部控制创建实例的数目 private Singleton(){} // 提供一个全局访问点,为客户端提供类实例 public static Singleton getInstance(){ return uniqueInstance; } // 示意方法,单例可以有自己的操作 public void singletonOperation(){ //功能处理 } // 示意属性,单例可以有自己的属性 private String singletonData; // 示意方法,让外部通过这些方法来访问属性的值 public String getSingletonData(){ return singletonData; } }

    2、案例分析

    (1)需求描述:读取应用的配置文件

    (2)采用单例模式实现(饿汉式)

    public class AppConfig { private static AppConfig instance = new AppConfig(); public static AppConfig getInstance(){ return instance; } // 用来存放配置文件中参数A的值 private String parameterA; // 用来存放配置文件中参数B的值 private String parameterB; public String getParameterA() { return parameterA; } public String getParameterB() { return parameterB; } // 私有化构造方法 private AppConfig(){ readConfig(); } // 读取配置文件,把配置文件中的内容读出来设置到属性上 private void readConfig(){ Properties p = new Properties(); InputStream in = null; try { in = AppConfig.class.getResourceAsStream("AppConfig.properties"); p.load(in); // 把配置文件中的内容读出来设置到属性上 this.parameterA = p.getProperty("paramA"); this.parameterB = p.getProperty("paramB"); } catch (IOException e) { System.out.println("装载配置文件出错了,具体堆栈信息如下:"); e.printStackTrace(); }finally{ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 客户端代码 public class Client { public static void main(String[] args) { //创建读取应用配置的对象 AppConfig config = AppConfig.getInstance(); String paramA = config.getParameterA(); String paramB = config.getParameterB(); System.out.println("paramA="+paramA+",paramB="+paramB); } }

     

    尾注

    上述的总结与思考是基于对《研磨设计模式》这本书的精读与演绎更多及时干货,请关注微信公众号:JAVA万维猿圈


    最新回复(0)