【设计模式】单例模式的实现--------java

单例模式:
一个类只有一个实例,并提供一个访问它的全局访问点。
应用场景:创建一个唯一的变量(对象)。
1.场景问题:(读取配置文件到内存)
文件名:AppConfig.properties
内容:paramA=a
paramB=b

package computer;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Test {
   
	public static void main(String[] args) {
   
		AppConfig config=new AppConfig();
		String paramA=config.getParameterA();
		String paramB=config.getParameterB();
		
		System.out.println("paramA="+paramA+"paramB="+paramB);
	}
}

class AppConfig{
   
	private String parameterA;
	private String parameterB;
	
	public AppConfig(){
   
		readConfig();
	}
	public String getParameterA() {
   
		return parameterA;
	}
	public String getParameterB() {
   
		return parameterB;
	}
	
	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的实例对象,资源浪费。

2.解决方案:(单例模式)
在这里插入图片描述
构造函数私有,用户无法通过new直接实例;静态方法负责检验并实例化自己,确保只有一个实例被创建。
注意:类中的私有成员变量也是静态的!

package computer;

public class Test {
   
	public static void main(String[] args) {
   
		Singleton s1=Singleton.GetInstance();
		Singleton s2=Singleton.GetInstance();
		
		if(s1==s2) {
   
			System.out.println("两个对象是相同的实例!");
		}else {
   
			System.out.println("两个对象是不同的实例!");
		}
	}
}

class Singleton{
   
	private static Singleton instance;
	//构造方法为私有,外界无法用new创建此类的对象
	private Singleton() {
   }
	
	public static Singleton GetInstance() {
   
		//实例不存在就new一个新实例,存在就返回已经有的实例
		if(instance==null) {
   
			instance=new Singleton();
		}
		return instance;
	}
}

缺点:多线程时可能同时有两个对象被创建。

3.多线程时的单例模式:
用到synchronized():被synchronized()修饰的区域每次只有一个线程可访问,其他线程若试图进入锁定的代码,将被阻止,直到对象被释放。

package computer;

public class Test {
   
	public static void main(String[] args) {
   
		Singleton s1=Singleton.GetInstance();
		Singleton s2=Singleton.GetInstance();
		
		if(s1==s2) {
   
			System.out.println("两个对象是相同的实例!");
			System.out.println("singleton1:"+s1.toString())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值