设计模式——单例模式

来源:互联网 发布:王珊数据库第五版 编辑:程序博客网 时间:2024/05/18 01:44

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

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

真让人抓狂。

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

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


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 的十六进制表示)。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 出水痘发烧39度怎么办 腰肌拉伤怎么办恢复快 过敏起大水泡了怎么办 身上长疱疹怎么办冶疗 刚怀孕长了疱疹怎么办 吃完饭恶心想吐怎么办 减肥药吃了心慌怎么办 吃多了恶心想吐怎么办 想吐怎么办最快最有效 想吐又吐不出来怎么办 3岁宝宝反胃呕吐怎么办 2岁宝宝反胃呕吐怎么办 突然恶心想吐是怎么办 孕4个月反胃呕吐怎么办 怀孕2月反应大怎么办 狗吐拉稀不吃饭怎么办 狗狗咳喘怎么办最有效 半永久纹眉失败怎么办 纹的眉毛太细了怎么办 眉毛颜色做深了怎么办 半永久眼线不掉怎么办 移植9天来月经怎么办 月经迟迟不来该怎么办 lol晋级赛输了怎么办 激素正常的多囊怎么办 右侧输卵管通而不畅怎么办 小该咳嗽老不好怎么办 孩子吓着了怎么办最快 2个月宝宝吓到了怎么办 3个月宝宝吓到了怎么办 宝宝吓着了发烧怎么办 好几个月不遗精怎么办 孕妇吃了黑橄榄怎么办 内膜4mm来月经了怎么办 吃了伟哥没效果怎么办 维a酸乳膏副作用怎么办 颈椎病引起的头晕恶心怎么办 经常头疼怎么办最快最有效 感昌了头晕乏力怎么办 来例假喝啤酒了怎么办 来月经喝啤酒了怎么办