单例模式
本质:控制实例数目
我们怎样去创建一个唯一的变量(对象)保证一个类仅有一个实例,并提供一个访
问它的全局访问点。
Singleton模式包含的角色只有一个,就是Singleton。
Singleton拥有一个私有构造函数,确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法GetInstance。GetInstance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其它对象提供这一实例
class Singleton
{
private static Singleton instance;
private Singleton()
{
}
public static Singleton GetInstance()
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if (s1 == s2)
{
Console.WriteLine("Objects are the same instance");
}
Console.Read();
}
}
单例模式的分类
懒汉式单例模式(时间换空间)
上述代码为懒汉式
饿汉式单例模式(空间换时间)
class Singleton
{
private static Singleton instance=new Singleton();
private Singleton() { }
public static Singleton GetInstance()
{
return instance;
}
}
在什么情形下使用单例模式:
使用Singleton模式有一个必要条件:在一个系统要求一个类只有一个实例时才应当使用单例模式。
反过来,如果一个类可以有几个实例共存,就不要使用单例模式。
例子
考虑一个应用,读取配置文件的内存 很多项目中,都有与应用相关的配置文件,一般是自定义的,在里面定义一些应用需要的参数数据。 多采用xml格式。也有采用properties格式的。
要读取配置文件的内容,如何实现?
package Singleton;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class AppConfig {
private static AppConfig instance;
private String parameterA;
private String parameterB;
public String getParameterA() {
return parameterA;
}
public String getParameterB() {
return parameterB;
}
public static AppConfig GetInstance() {
if (instance == null) {
instance = new AppConfig();
}
return instance;
}
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();
}
}
}
}
AppConfig.properties
paramA=a
paramB=b
package Singleton;
public class Client {
public static void main(String[] args) {
AppConfig s1 = AppConfig.GetInstance();
AppConfig s2 = AppConfig.GetInstance();
if (s1 == s2) {
System.out.println("Objects are the same instance");
}
String paramA = s1.getParameterA();
String paramB = s2.getParameterB();
System.out.println("paramA=" + paramA + ",paramB=" + paramB);
}
}