设计模式之单例(Singleton)模式

      一、什么单例(Singleton)模式

      单例(Singleton)模式属于GoF《设计模式》中的创建型模式。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供一个访问它的全局访问点,用于访问该实例。这个类称为单例类。

 

      二、单例模式的要点

      显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例,因此,若某个类满足以上单例模式的三个要点,则该类就是单例模式了。

 

      三、单例模式的实现

      从单例模式的要点可以看出,要实现单例模式只要满足以上三个要点即可,则该模式的实现方式有很多种,现在只列出最常用的实现方法,如下:

package com.huawei.designpattern.singleton;

/**
 * 单例模式
 * @author William liu
 *
 */
public class Singleton {

	//声明一个private static的对象,供newInstance方法使用
	private static Singleton singleton;

	/**
	 * 将构造函数改为private,
	 * 则该类不能被其他类实例化,只能被自身实例化
	 */
	private Singleton() {

	}

	/**
	 * 将该方法作为访问该单例类的一个全局访问点,
	 * 同时在该方法类将自身实例化
	 * @return Singleton
	 */
	public static Singleton newInstance() {
		if (singleton == null) {
			synchronized (Singleton.class) {
				if (singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
	
	//Other methods omitted
}

      在以上Java代码中,简单实现了一个单例模式。首先、通过将构造函数改为private,让其他类不能实例化该类。其次、将实例化类的工作放到了该类的newInstance方法中,同时让该方法为public static的,目的是让其他类必须通过类名调用该方法实例化或访问该类,满足了单例模式要点的第三点。第三、在newInstance方法中,第一个if (singleton == null)限制了该类只能创建一个实例,满足了单例模式要点的第一点。第四、在newInstance方法中的singleton = new Singleton();代码将自身实例化,满足单例模式要点的第二点。

 

      下面,我们来测试一下我们的单例模式,在这里我们不使用junit测试,代码如下:

package com.huawei.designpattern.singleton;

public class Test {

	public static void main(String[] args) {
		
		//分别获得两个单例模式的对象
		Singleton singleton1 = Singleton.newInstance();
		Singleton singleton2 = Singleton.newInstance();
		
		//分别打印两个对象的hash code
		System.out.println(singleton1.hashCode());
		System.out.println(singleton2.hashCode());
		
		//判断这两个对象的内存地址是否相等
		System.out.println(singleton1 == singleton2);
	}
}

       在测试代码中,我们创建了两个对象,分别打印了这两个对象的hashCode,然后再比较这两个对象的内存地址是否相等。我们知道,同类型的两个对象,若他们的hashcode相等、或他们的内存地址相等,则这两个对象是同一个对象,运行我们的代码看看结果吧:

12677476
12677476
true

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值