单例模式的引入
读取配置文件
考虑这样一个应用,读取配置文件的内容。很多项目里面,都有与应用先关的配置文件,这些配置文件很多都是由项目开发人员自定义的,在里面定义了一些应用所需要的参数。当然在实际的开发中,这个配置文件有很多种格式,如XML,properties ,现在要读取配置文件,该如何实现喃?
不用模式的解决方案
package com.study.design.pattern.singleton.example;import lombok.Getter;import lombok.Setter;import lombok.ToString;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/** * 类的描述:读取应用配置文件 * * @author: like * @createDate: 2018年11月12日 20:24 * @version: v1.0 * @jdk version used: JDK1.8 * @see <相关类> */@ToStringpublic class AppConfig { /** * 用来存放配置文件参数A的值 */ private String parameterA; /** * 用来存放配置文件参数B的值 */ private String parameterB; public String getParameterA() { return parameterA; } public void setParameterA(String parameterA) { this.parameterA = parameterA; } public String getParameterB() { return parameterB; } public void setParameterB(String parameterB) { this.parameterB = parameterB; } public 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){ e.printStackTrace(); }finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }
测试类
package com.study.design.pattern.singleton.example;import org.junit.Test;import static org.junit.Assert.*;/** * 类的描述: * * @author: like * @createDate: 2018年11月12日 20:38 * @version: v1.0 * @jdk version used: JDK1.8 * @see <相关类> */public class AppConfigTest { @Test public void testReadProperties(){ AppConfig appConfig = new AppConfig(); String paramA = appConfig.getParameterA(); String paramB = appConfig.getParameterB(); System.out.println(appConfig.toString()); System.out.println("paramA = " + paramA +" paramB = " + paramB); } }
上面的实现很简单,但是有一个问题,就是在系统运行中,很多类都需要用到配置,如果在每一个类中都去 new
一个 Appconfig
,会严重的浪费内存资源,实际上,对于AppConfig这种类而言,只需要在运行的时候有一个实例就好了
总结:类在全局只需要一个实例,怎么实现?
解决方案
使用单例模式来解决问题
什么是单例模式?
单例模式的定义 : 保证一个类仅有一个实例,并提供一个全局的访问点
解决问题的思路
上面代码的问题在于构造方法是公开的,可以构建多个实例,所以构造方法不能公开。
单例模式结构图
image
Singlteton : 负责创建Singleton类的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例。
单例模式的分类
graph TD A[单例模式] -->B(懒汉式) A[单例模式] -->C(饿汉式)
1.懒汉式实现代码
package com.study.design.pattern.singleton;/** * 类的描述:测试懒汉式单例模式 * 线程安全,调用效率不高,但是可以延迟加载 * * @author: like * @createDate: 2018年11月05日 22:35 * @version: v1.0 * @jdk version used: JDK1.8 * @see <相关类> */public class SingletonDemo2 { /* * 创建懒汉式的思路 * * 1. 构造器私有化 * 2. 创建一个私有的static的类属性,懒汉式是创建属性的时候不创建对象 * 3. 提供一个public的方法用于获取对象 */ /** * 2. 创建一个私有的static的类属性 , 类初始化的,不加载对象,到使用的时候加载对象 */ private static SingletonDemo2 singletonDemo2 ; /** * 1. 构造器私有化 */ private SingletonDemo2(){ } /** * 3. 提供一个public的方法用于获取对象 * @return SingletonDemo2 */ public static synchronized SingletonDemo2 getInstance(){ if(singletonDemo2 == null){ singletonDemo2 = new SingletonDemo2(); } return singletonDemo2; } }
作者:IT_JAVA_文艺男
链接:https://www.jianshu.com/p/4c91bc35785c
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦