网上介绍设计模式的文章已经不少了,我也大概看了几个,都很不错。
有时候遇到问题,需要查找解决办法,让人比较郁闷的情况就出现了,按照关键字一搜索,出来了各种网站的解决办法,但是,其内容都一样,甚至里面的错误都是一样的。
真让人抓狂。
不过,对于同一个问题的不同描述,或者同一种描述的不同种表达,有时候就是那么一句话的不同,让人有茅塞顿开的感觉。
我本来想完完整整的将所有设计模式通过自己的理解表达出来,但是一直拖着,到现在为止才写了这么几个,以后会慢慢完善的。
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 的十六进制表示)。