单例模式的两种实现方法

单例模式的两种实现方法

单例模式是什么

单例模式是为了实现程序运行过程中一个类只产生唯一一个对象,即"一个类只被实例化一次"的目的而产生的.单例模式是java语言23种设计模式中实现起来最简单的一种.

如何实现单例模式

第一步:对于要被我们限制的类,如果我们不想它被多次实例化,首先应该杜绝的操作就是"在其他的类中被new关键字new出来"----要想被实例化,必须被它监管才能.所以我们要对此类的构造器动手脚----把构造器私有化!这样一来,其他的类都没办法进行普通的实例化操作了.
public class Bank {

	private Bank() {
	}// 把构造器私有化	
}

第二步:既然我们把Bank这个类的"实例化入口"封闭了,那怎么才能创建那个唯一的对象呢?我们在这个类里面提供一个公有的静态方法,这个公有的静态方法返回给调用者一个对象不就成了吗?
public class Bank {

	private Bank() {
	}// 把构造器私有化

	private static Bank bank = new Bank();// 创建静态变量,保证只有一个bank被创建

	public static Bank getBank() {
		
		return bank;
	}
}
这样一来就解决了我们的问题,外部调用的时候不必创建Bank类的对象,直接用Bank.getBank();命令就可以得到一个唯一的bank对象了.
我们注意到这种方法由于static修饰的影响,在Bank类第一次被调用的时候便创建了那个唯一的bank对象,所以这种方法有一种形象的称呼:饿汉式.

实现单例模式的第二种方法

在某些情况下,我们并不希望bank对象被创建得那么早,我们想要在我们要用到bank对象的时候再去创建它,没用到的时候省下内存空间去做其他事情.这个时候我们就要用到第二种方法:懒汉式.
public class Bank {

	private Bank() {
	}// 把构造器私有化

	private static Bank bank;// 创建静态变量,保证只有一个bank被创建

	public static Bank getBank() {
		if (bank == null) {
			bank = new Bank();// 如果还没有创建bank,就创建一个新的bank
		}
		return bank;// 除第一次外,都不会再次创建bank对象,只会把前面创建过的静态变量bank返回
	}
}
在上面的代码中我们看到,我们创建静态变量的时候并没有真的实例化,bank此时指向一个null.而在setBank()方法被调用的时候,我们进行了一次判断:如果bank仍然是null,那说明bank还没有被实例化,我们就进行实例化操作;如果bank已经指向了某一个bank对象,那直接把这个对象返回给调用者.


我们用第二种方法进行试验:
public class Test {

	public static void main(String[] args) {

		Bank bank = Bank.getBank();
		Bank bank1 = Bank.getBank();
		System.out.println(bank == bank1);// 两次创建的bank都是同一个对象,所以结果为真
	}
}
public class Bank {


<span style="white-space:pre">	</span>private Bank() {
<span style="white-space:pre">	</span>}// 把构造器私有化


<span style="white-space:pre">	</span>private static Bank bank;// 创建静态变量,保证只有一个bank被创建


<span style="white-space:pre">	</span>public static Bank getBank() {
<span style="white-space:pre">		</span>if (bank == null) {
<span style="white-space:pre">			</span>bank = new Bank();// 如果还没有创建bank,就创建一个新的bank
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return bank;// 除第一次外,都不会再次创建bank对象,只会把前面创建过的静态变量bank返回
<span style="white-space:pre">	</span>}
}

输出结果为true.确实只有一个实例化!





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值