设计模式——单例模式

网上介绍设计模式的文章已经不少了,我也大概看了几个,都很不错。

有时候遇到问题,需要查找解决办法,让人比较郁闷的情况就出现了,按照关键字一搜索,出来了各种网站的解决办法,但是,其内容都一样,甚至里面的错误都是一样的。

真让人抓狂。

不过,对于同一个问题的不同描述,或者同一种描述的不同种表达,有时候就是那么一句话的不同,让人有茅塞顿开的感觉。

我本来想完完整整的将所有设计模式通过自己的理解表达出来,但是一直拖着,到现在为止才写了这么几个,以后会慢慢完善的。


package com.cn.wxwinnie.DesignPattern.singleton;

import java.util.Date;

/**
 * 静态代码块版本的单例。
 * 这里需要说说静态代码块,静态代码块不需要显示的调用,也就是在类通过虚拟机加载进去后,就会执行。
 * 而且只执行一次。也就是如果其中放置了变量初始化的话,这个变量就只初始化赋值一次。这里就利用这一点实现单例的。
 * 
 * 备注:这里之所以加上一个Date的属性字段,是为了每次执行程序的时候产生不同的hashcode(下同)。
 * 
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 * 
 * @version 创建时间:2014年3月19日 上午10:41:14
 * 
 */
public class ASingleton1 {
	private static ASingleton1 as = null;
	static {
		as = new ASingleton1();
		Date d = new Date();
	}

	public static ASingleton1 getInstance() {
		return as;
	}
}




另一个版本的:

package com.cn.wxwinnie.DesignPattern.singleton;

import java.util.Date;

/**
 * 私有构造函数版本的单例。
 * 我们经常出现这样的代码 User user = new User(); 
 * 其实这里的new User()调用的是User类中的共有的构造函数。
 * 当然这种无参数的构造函数在没有显示的写出来的话,java会自动的创建一个,如果显示的现出来的话,就会调用显示写出来的这一个。
 * 但是如果将这个无参构造方法写成私有的,那么外部就无法通过调用无参构造方法来初始化这个类的对象了。就只能使用其他的办法了。
 * 这个类中通过 private static final ASingleton2 as = new ASingleton2() 创建了一个对象。而且由于这个属性是私有static的,
 * 也就是这是一个类变量,类变量的话,也是在类被加载的时候初始化的。而且是final的,也就只能被初始化一次。
 * 
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 * 
 * @version 创建时间:2014年3月19日 上午10:44:24
 * 
 */
public class ASingleton2 {
	private static final ASingleton2 as = new ASingleton2();
	private static final Date d = new Date();

	// 此处写成私有方法可以防止用户在外面用new方法来产生。
	private ASingleton2() {
	}

	public synchronized static ASingleton2 getInstance() {
		return as;
	}

}

然后测试:

package com.cn.wxwinnie.DesignPattern.singleton;

import com.cn.wxwinnie.utils.PrintLine;

/**
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 * 
 * @version 创建时间:2014年3月19日 上午10:45:24
 * 
 */
public class Test {

	public static void main(String[] args) {
		ASingleton1 as10 = ASingleton1.getInstance();
		ASingleton1 as11 = ASingleton1.getInstance();
		ASingleton1 as12 = ASingleton1.getInstance();
		ASingleton1 as13 = new ASingleton1();// 因为这个类中没有显示的写出无参构造方法,这里java自动生成了一个,可以这么写。

		ASingleton2 as20 = ASingleton2.getInstance();
		ASingleton2 as21 = ASingleton2.getInstance();
		ASingleton2 as22 = ASingleton2.getInstance();// 这个类中的无参构造方法被复写为私有的,所以,这里无法调用无参构造方法。

		PrintLine.pringLine("静态代码块版本");
		System.out.println(as10);
		System.out.println(as11);
		System.out.println(as12);
		System.out.println(as13);
		
		PrintLine.pringLine("私有构造方法版本");
		System.out.println(as20);
		System.out.println(as21);
		System.out.println(as22);
	}

}

运行结果为:

***********静态代码块版本***********
com.cn.wxwinnie.DesignPattern.singleton.ASingleton1@24c21495
com.cn.wxwinnie.DesignPattern.singleton.ASingleton1@24c21495
com.cn.wxwinnie.DesignPattern.singleton.ASingleton1@24c21495
com.cn.wxwinnie.DesignPattern.singleton.ASingleton1@41d5550d
***********私有构造方法版本***********
com.cn.wxwinnie.DesignPattern.singleton.ASingleton2@1cc2ea3f
com.cn.wxwinnie.DesignPattern.singleton.ASingleton2@1cc2ea3f
com.cn.wxwinnie.DesignPattern.singleton.ASingleton2@1cc2ea3f


从运行结果的hashcode可以看出来。(@符号后面的数字为hashcode 的十六进制表示)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值