单例模式的两种实现方法
单例模式是什么
单例模式是为了实现程序运行过程中一个类只产生唯一一个对象,即"一个类只被实例化一次"的目的而产生的.单例模式是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.确实只有一个实例化!