设计模式--单例模式(四)单例模式实例配置 Properties

本文是设计模式系列的第四篇,主要探讨如何使用Properties文件来配置和实现单例模式。从懒汉式、饿汉式到登记式,逐步引入改进,最后详细阐述了基于Properties的单例模式应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是设计模式学习笔记的第二篇文章,主要分析的是单例模式。包括懒汉式,饿汉式,登记式,以及懒汉式的改进型,还有一个关于读取propertoes配置文件的实例。这是第四节,这次我们来看一下如何用单例模式配置配置文件。


Properties 基本知识

  如果不熟悉 java.util.Properties 类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的,如清单 1 所示。 

  清单 1. 一组属性示例


 
foo=bar fu=baz
  将清单 1 装载到 Properties 对象中后,您就可以找到两个键( foo 和 fu )和两个值( foo 的 bar 和 fu 的 baz )了。这个类支持带 /u 的嵌入 Unicode 字符串,但是这里重要的是每一项内容都当作 String 。   清单 2 显示了如何装载属性文件并列出它当前的一组键和值。只需传递这个文件的 InputStream 给 load() 方法,就会将每一个键-值对添加到 Properties 实例中。然后用 list() 列出所有属性或者用 getProperty() 获取单独的属性。   清单 2. 装载属性
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"));  } }
  运行 LoadSample 程序生成如清单 3 所示的输出。注意 list() 方法的输出中键-值对的顺序与它们在输入文件中的顺序不一样。 Properties 类在一个散列表(hashtable,事实上是一个 Hashtable 子类)中储存一组键-值对,所以不能保证顺序。 现在对properties有了初步的了解,现在我们把它和单例模式结合起来。
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为同一实例(改进懒汉式)<<<<<




相关链接:

设计模式--单例模式(一)懒汉式和饿汉式

设计模式--单例模式(二)登记式

设计模式--单例模式(三)改进型懒汉式

设计模式--单例模式(四)单例模式实例配置 Properties






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值