单例模式

单例模式

一、什么是单例模式?

确保对象的唯一性:拿到某个类的对象,始终都是同一对象,即每个对象的引用地址是唯一的

二、引入单例模式

1、如何确保创建的对象的唯一性
我们使用new关键字创建对象的时候,对象的数量数不受限制的,那么将这些对象进行恒等比较的时候,他们的哈希值必定是不相等的

class Test {
	public static void main(String[] args) {
		
		Single s1 =  new Single();
		Single s2 = new Single();
		System.out.println(s1 == s2);   //false	
	}
}

class Single{
}


那么如何能防止让外部类不受限制的new当前类的对象呢?我们首先想到的是静态化。这样我们就可以通过类名创建类的对象

class Test2 {
	public static void main(String[] args) {
		
		Single s1 = Single.s;
		Single s2 = Single.s;

		System.out.println(s1 == s2);  //true
	}
}

class Single{

	static Single s = new Single();
}

但是直接通过类名去获取类中创建的静态的本类对象成员变量不安全,是直接对外暴露的,因此我们又选择对构造器的封装
怎么能保证在外类中不能通过 Single.s 直接获取Single类中创建的静态的本类对象的成员变量呢?
私有化
又让外类怎么能拿到呢?
对外提供静态的公共的访问方式

所有就有了我们的单例模式

class Single1 {
	public static void main(String[] args) {
		
		Single s1 = Single.setSingle();
		Single s2 = Single.setSingle();
		System.out.println(s1);
		System.out.println(s2);
	}
}

class Single{
	private Single(){}

	private static Single s = new Single();
	public static Single setSingle(){
		return s;
	}
}

2.两种单例模式

而单例模式又分两种:
1、饿汉模式
在类创建的时候就创建了一个静态的类对象供系统使用,代码如下:

class Single1 {
	public static void main(String[] args) {
		
		Single s1 = Single.setSingle();
		Single s2 = Single.setSingle();
		System.out.println(s1);
		System.out.println(s2);
	}
}

class Single{
	private Single(){}

	private static Single s = new Single();
	public static Single setSingle(){
		return s;
	}
}

2、懒汉模式
第一次调用该类的静态方法进行初始化对象的时候才创建该类的对象

class Single2 {
	public static void main(String[] args) {
		Single s1 = Single.setSingle();
		Single s2 = Single.setSingle();
		System.out.println(s1 == s2);  // true
		
	}
}

class Single{

	private Single(){}
	
	// 懒汉模式
	private static Single s = null;
	public static Single setSingle(){
		if(s == null){
			s = new Single();
		}
	return s;
	}
}

新手才疏学浅,有不对的地方请各位大佬指教。[^1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值