singleton(1)
来源:互联网 发布:政府大数据解决方案 编辑:程序博客网 时间:2024/05/21 12:24
问题场景:为了系统的可维护性,如今系统中都会有一些配置文件,而这些配置文件需要做一些初始化,一般来说,配置文件都是以xml或者properties文件形式存在,今天以properties来重现问题传统的来说,我们会创建一个和配置文件属性相关的配置类.ConfigModel。有一个解析配置文件的地方,将配置文件内容存到ConfigModel的实例当中,由于系统中用到配置文件的地方可能会很多,这样就会有多个ConfigModel的实例存在内存中,他们的内容又是一样,于是这时就造成了资源的浪费。
问题重现:
配置文件:config.properties的内容
1=this is a test
2=what do you know
ConfigModel类
写本类需要注意的是,在读取结束的时候要关闭流。
如此可以直接在Client类中调用:
想想有什么问题?
明显的,是调用中有new关键字,这个字是为产生新对象则存在的,在我们系统内有多个地方需要配置文件的内容的时候,我们就会新创建一个对象放到内存里,这样该造成多大的资源浪费啊...
我们可以就只创建一个对象,同一个对象,在用的时候去取不就完了吗?
于是就有了singleton,单例
单例模式有两种写法,我分别介绍.
1、懒汉式
重写ConfigModel1
问题重现:
配置文件:config.properties的内容
1=this is a test
2=what do you know
ConfigModel类
/** * 配置文件 * @author liuwy * */public class ConfigModel {private String paramA;private String paramB;public String getParamA() {return paramA;}public void setParamA(String paramA) {this.paramA = paramA;}public String getParamB() {return paramB;}public void setParamB(String paramB) {this.paramB = paramB;}public ConfigModel() {config();}private void config() {Properties prop = new Properties();InputStream in = null;try {in = ConfigModel.class.getResourceAsStream("config.properties");prop.load(in);this.paramA = prop.getProperty("1");this.paramB = prop.getProperty("2");} catch (IOException e) {e.printStackTrace();}finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}}
写本类需要注意的是,在读取结束的时候要关闭流。
如此可以直接在Client类中调用:
public static void main(String[] args) {ConfigModel m = new ConfigModel();System.out.println(m.getParamA());System.out.println(m.getParamB());}
明显的,是调用中有new关键字,这个字是为产生新对象则存在的,在我们系统内有多个地方需要配置文件的内容的时候,我们就会新创建一个对象放到内存里,这样该造成多大的资源浪费啊...
我们可以就只创建一个对象,同一个对象,在用的时候去取不就完了吗?
于是就有了singleton,单例
单例模式有两种写法,我分别介绍.
1、懒汉式
重写ConfigModel1
/** * 懒汉式 * @author liuwy * */public class ConfigModel1 {private String paramA;private String paramB;public String getParamA() {return paramA;}public void setParamA(String paramA) {this.paramA = paramA;}public String getParamB() {return paramB;}public void setParamB(String paramB) {this.paramB = paramB;}private static ConfigModel1 m = null;//私有化构造方法private ConfigModel1() {config();}public static ConfigModel1 getInstance() {if(m == null) {m = new ConfigModel1();return m;}return m;}private void config() {Properties prop = new Properties();InputStream in = null;try {in = ConfigModel.class.getResourceAsStream("config.properties");prop.load(in);this.paramA = prop.getProperty("1");this.paramB = prop.getProperty("2");} catch (IOException e) {e.printStackTrace();}finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}}}
客户端中只需要ConfigModel1.getInstatnce()调用产生m就行了。
由程序中可以看到,我们只是在内存中滑configModel的时候才去创建,有的话就返回,即保证了内存中只有一个config,节省了空间。
2、饿汉式:
与懒汉式稍有不同,只是在定义ConfieModel1的时候,直接new初始化
getInstance() 中直接返回对象
这样的做法是系统直接在内存中存在了一个对象,而且是一直存在,不需要客户再去创建,节省了时间。
可以分析得出:懒汉式是以时间换空间,而饿汉式则是以空间换时间。
由程序中可以看到,我们只是在内存中滑configModel的时候才去创建,有的话就返回,即保证了内存中只有一个config,节省了空间。
2、饿汉式:
与懒汉式稍有不同,只是在定义ConfieModel1的时候,直接new初始化
getInstance() 中直接返回对象
这样的做法是系统直接在内存中存在了一个对象,而且是一直存在,不需要客户再去创建,节省了时间。
可以分析得出:懒汉式是以时间换空间,而饿汉式则是以空间换时间。
0 0
- singleton(1)
- 模式1 singleton
- Design Pattern 1: Singleton
- Singleton
- Singleton
- singleton
- Singleton
- Singleton
- Singleton
- Singleton
- Singleton
- Singleton
- Singleton
- Singleton
- Singleton
- singleton
- Singleton
- Singleton
- 用C#用正则如何提取出标签a中的内容
- OnUpdate()和OnDraw()
- android笔记11 基于vuforia的图像识别Jar的使用
- Ubuntu新建用户
- Mysql常用命令 详细整理版
- singleton(1)
- Instrument检测内存泄露时那些窗口分别代表
- C/C++易错题解析
- Javascript 的addEventListener()及attachEvent()区别分析
- 成名要趁晚
- 电脑中不可恢复删除的文件吗
- Activiti 5 使用ab并发测试100个并发失败
- 1023. Have Fun with Numbers
- 360掐架搜狗浏览器