本文是设计模式学习笔记的第二篇文章,主要分析的是单例模式。包括懒汉式,饿汉式,登记式,以及懒汉式的改进型,还有一个关于读取propertoes配置文件的实例。这是第四节,这次我们来看一下如何用单例模式配置配置文件。
Properties 基本知识
如果不熟悉 java.util.Properties 类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的,如清单 1 所示。
清单 1. 一组属性示例
foo=bar fu=baz |
import java.util.*; import java.io.*; public class LoadSample { public static void main(String args[]) throws Exception { Properties prop = new Properties(); FileInputStream fis = new FileInputStream("sample.properties"); prop.load(fis); prop.list(System.out); System.out.println("/nThe foo property: " + prop.getProperty("foo")); } } |
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
//Properties配置文件的单例模式
public class MySingleton4 {
//设定配置文件地址
private static final String filePath = "D:/mywork/user.properties";
private File myFile = null;
//最后一次更新时间
private long lastTime = 0;
//配置文件
private Properties myProps = null;
//配置文件--用户
private String p_user = "";
//配置文件--密码
private String p_password = "";
//设立静态变量,直接创建实例
private static MySingleton4 mySingleton = null;
/**
*
* @author qian.xu
*
*/
private static class Singleton{
public static MySingleton4 getInstance(){
System.out.println("---->内部类创建实例方法被调用");
MySingleton4 mySingleton = new MySingleton4();
System.out.println("---->内部类方法调用结束");
return mySingleton;
}
}
//获取从配置文件取得的信息
public String getPuser(){
return p_user;
}
public String getPpassword(){
return p_password;
}
private MySingleton4() {
// 私有化构造函数
System.out.println("-->私有化构造函数被调用,创建实例中");
myFile = new File(filePath);
lastTime = myFile.lastModified();
if (lastTime == 0) {
System.err.println(filePath + " file does not exist!");
}
myProps = new Properties();
try {
myProps.load(new FileInputStream(filePath));
System.out.println("-->properties文件加载完成");
p_user = myProps.getProperty("user");
p_password = myProps.getProperty("password");
System.out.println("-->properties文件属性读取完成");
} catch (IOException e) {
e.printStackTrace();
}
}
// 开放一个公有方法,判断是否已经存在实例,有返回,没有新建一个在返回
public static MySingleton4 getInstance() {
MySingleton4 s1 = null;
if(mySingleton == null){
System.out.println("-->没有实例,调用内部类方法返回实例");
mySingleton = MySingleton4.Singleton.getInstance();
}
s1 = mySingleton;
System.out.println("-->返回实例");
return s1;
}
}
客户端代码为:
/**
* Properties配置文件加载
* MySingleton4
*/
public static void myprint4(){
System.out.println("---------------单例模式实例--------------");
System.out.println("第一次取得实例");
MySingleton4 s1 = MySingleton4.getInstance();
System.out.println(s1.getPuser());
System.out.println(s1.getPpassword());
System.out.println("第二次取得实例");
MySingleton4 s2 = MySingleton4.getInstance();
System.out.println(s2.getPuser());
System.out.println(s2.getPpassword());
if(s1==s2){
System.out.println(">>>>>s1,s2为同一实例(改进懒汉式)<<<<<");
}
System.out.println();
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//懒汉式
//myprint();
//饿汉式
//myprint2();
//懒汉式改进
//myprint2a();
//登记式
//myprint3();
//实例
myprint4();
}
打印结果为:
---------------单例模式实例--------------
第一次取得实例
-->没有实例,调用内部类方法返回实例
---->内部类创建实例方法被调用
-->私有化构造函数被调用,创建实例中
-->properties文件加载完成
-->properties文件属性读取完成
---->内部类方法调用结束
-->返回实例
admin
123456
第二次取得实例
-->返回实例
admin
123456
>>>>>s1,s2为同一实例(改进懒汉式)<<<<<
相关链接: