单例模式的引入
读取配置文件
考虑这样一个应用,读取配置文件的内容。很多项目里面,都有与应用先关的配置文件,这些配置文件很多都是由项目开发人员自定义的,在里面定义了一些应用所需要的参数。当然在实际的开发中,这个配置文件有很多种格式,如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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
