《java与模式》学习系列——单例模式

 

一、 单例模式的结构

单例模式有三个要点:

一是某个类只能有一个实例;

二是它必须自行创建这个事例;

三是它必须自行向整个系统提供这个实例。

 

饿汉式单例类

源代码如下:

 

特点:类被加载时,静态变量m_instance会被初始化,此时类的私有构造子会被调用,这时候类的惟一实例就被创建出来了。

懒汉式单例类

源代码如下:

 

特点:类被加载时,m_instance还会被初始化,只有第一次引用时才会被初始化。另外上面程序中对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用所谓的“双重检查成例”,必须指出的是,“双重检查成例”不可以在java语言中使用。

饿汉式与懒汉式的比较:

从资源利用效率角度:饿汉式单例类稍差些,因此饿汉式单例类在自己被加载时就将自己实例化了。

从速度和反应时间角度来讲:饿汉式单例类则稍好一些,因为懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题

从语言角度:饿汉式易于在java内实现,不易在c++中实现,因为静态初始化在c++里没有固定的顺序,可能会出现问题,因此在java中用饿汉式会好一些,在c++中用懒汉式好一些。

登记式单例类

克服饿汉式单例类及懒汉式单例类不可继承的缺点。

代码如下:

 

错误使用单例模式的两种情况:

1、不要用一个单例类盛放所有的“全程”变量,这不符合单例模式的三个条件,违反了单例模式的用意。一个设计得当的系统不应当有所谓的“全程”变量,这些变量应当放到它们所描述的实体所对应的类中去。将这些变量从它们所描述的实体类中抽出来,放到一个不相干的单例类中去,使得这些变量产生错误的依赖关系和耦合关系。

2、系统中管理与数据库的链接时,使用单例类包装一个Connection对象,并在finalize方法中关闭connection对象。这样做是不恰当的,除非有单一实例的需求,否则不要使用单例模式。在这里Connection对象可以同时有几个实例共存,不必是单一实例。

二、 单例模式在java中的应用

javaRuntime对象

java语言内部,java.lang.Runtime对象就是一个使用单例模式的例子。在每一个Java应用程序里面,都有惟一的一个Runtime对象。Runtime类提供一个静态工厂方法getRuntime()方法:public static Runtime getruntime();Runtime对象通常的用途包括:执行外部命令;返回现有内存即全部内存;运行垃圾收集器;加载动态库。

Introspector(自省)

Introspector类的构造子是私有的,一个静态工厂方法instantiate()提供了Introspector类的惟一实例。一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值