目录
思想
在系统运行期间,某个类只需要一个实例就可以了。
考虑四点
1.怎么控制实例的创建? 构造函数私有
2.私有后别人怎么访问该实例?且不创建实例的访问?public静态方法getInstance()
3.方法内部怎么实现呢?用属性来记录创建好的类实例,当第一次创建后,将这个实例保存下来进行复用。因为该方法是静态的,因此属性被迫成为类变量加上static
4.如何实现控制实例的创建?在静态方法里面判空 (懒汉式){进来不会创建,判空后才创建}
4.进来属性直接给它一个new 实例(),在静态方法中直接使用创建好的实例
package day04单例模式;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Properties;
/**
* 读取应用配置文件
*/
public class AppConfig implements Serializable {
/**
* 1.定义一个变量来存储创建好的类实例,直接在这里创建类实例,只能创建一次 (饿汉式)
* 2.提供供外部访问内部实例的方法
* 3.私有化构造方法
*/
private static AppConfig instance = new AppConfig();
/**
* 提供 供外部访问内部实例的方法
* 静态方法,是使用static关键字修饰的方法,又叫类方法。
* 属于类的,不属于对象,在实例化对象之前就可以通过类名.方法名调用静态方法。
*/
public static AppConfig getInstance(){
return instance;
}
/**
* 用来存放配置文件中参数A的值
*/
private String parameterA;
/**
* 用来存放配置文件中参数B的值
*/
private String parameterB;
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
/**
* 构造方法私有
*/
private 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){
System.out.println("装载配置文件出错了,具体堆栈信息如下: ");
e.printStackTrace();
}finally {
try {
in.close();
}catch (IOException e ){
e.printStackTrace();
}
}
}
}
client
package day04单例模式;
public class Client {
public static void main(String[] args) {
// 创建读取应用配置的对象
AppConfig config = AppConfig.getInstance();
String parameterA = config.getParameterA();
String parameterB = config.getParameterB();
System.out.println("paramA = " + parameterA + ",paramB = " + parameterB);
}
}