【设计模式】单例模式

单例模式

本质:控制实例数目

我们怎样去创建一个唯一的变量(对象)保证一个类仅有一个实例,并提供一个访
问它的全局访问点。
在这里插入图片描述
Singleton模式包含的角色只有一个,就是Singleton。
Singleton拥有一个私有构造函数,确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法GetInstanceGetInstance方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。

特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其它对象提供这一实例
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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值