设计模式——单例模式
来源:互联网 发布:王珊数据库第五版 编辑:程序博客网 时间: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 的十六进制表示)。
- 设计模式—单例设计模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 设计模式——单例模式
- 说的好,不然做得好
- DB2入门操作之二
- 等不过如此
- 第一篇CSDN博客
- 10 款高质量的 jQuery 表单验证插件
- 设计模式——单例模式
- 基于ARM11的嵌入式人脸识别系统的设计与实现--笔记一
- SQL Server注释
- 黑马程序员——java基础语法
- MFC的多国语言界面的实现--win7+vs2010
- php关于接收post过来的xml信息以及给出响应(response)
- PHP中冒号、endif、endwhile、endfor这些都是什么
- 黑马程序员__交通灯
- DB2远程登录配置