java单例模式的详细介绍
2008-11-18 11:05
316 查看
Ø 单例类(singleton)可以保证系统中只可能由该类的一个对象,而且这个对象由类自行初始化。
Ø 单例类一般可以用来抽象系统中一些共享的资源。
Ø 单例类有如下特点:
§ 单例类只有一个实例。
§ 单例类自行创建并提供这个唯一的实例。
Ø 资源管理器一般做成单例模式。譬如每台计算机可以有若干个打印机,但只能有 一个Printer Spooler,以避免两个打印作业同时输出到打印机中。
Ø 单例模式有以下的特点:
§ 单例类只能有一个实例。
§ 单例类必须自己创建自己的惟一的实例。
§ 单例类必须给所有其他对象提供这一实例。
Ø 饿汉式单例类
Private static final EagerSingleton m_instance=new EagerSingleton();
Private EagerSingleton(){}
Public static EagerSingleton getInstance()
{
Return m_instance;
}
l 在这个类被加载时,静态变量
m_Instance会被初始化,此时
类的私有构造器会被调用。这
时候,单例类的惟一实例就被
创建出来了。
l Java语言中单例类的—个最重
要的特点是类的构造于是私有
的,从而避免外界利用构造子
直接创建出任意多的实例。
l 值得指出的是,由于构造于是
私有的,因此此类不能被继承。
Ø 懒汉式单例类
Public class LazySingleton
{
Private Static LazySingleton
m_instance=null;
}
Private LazySingleton(){}
Synchronized public static LazySingleton
getInstance()
{
If(m_instance==null)
{
m_instance=new LazySingleton();
}
Return m_instance;
}
l 静态工场方法使用了同步化,
以处理多线程环境。
l 单从资源利用效率角度来讲,
这个比懒汉式单例类稍差些
l 从速度和反应时间角度来讲,
则比懒汉式单例类稍好。
l 然而,懒汉式单例类在实例
化时,必须处理好在多个线程
同时首 次引用此类时的访问
限制问题,特别是当单例类作
为资源控制器在实例化时必然
涉及资源初始化.而资源初始
化很有可能耗费时问。这意味
着出现多线程同时首次引用此
类的几率变得较大。
具体的一个例子:
class Singleton{
private static Singleton onlyone =
new Singleton();
private int value;
public static Singleton getSingle() {
return onlyone;
}
private Singleton() {}
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
}
class Singleton{
private static Singleton onlyone = null;
private int value;
public static Singleton getSingle() {
if(onlyone==null){
onlyone = new Singleton();
}
return onlyone;
}
private Singleton() {}
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
}
public class Test {
public static void main(String args[]){
Singleton s1 = Singleton.getSingle();
Singleton s2 = Singleton.getSingle();
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
s1.setValue(100);
s2.setValue(200);
System.out.println(s1.getValue());
}
}
在什么情况使用单例模式
使用单例模式有 一个必要条件:在一个系统要求 一个类只有—个实例时才应当使用单例模式。反过来说,如果一个类可以有几个实例共存.那么就没有必要使用单例类。
Ø 单例类一般可以用来抽象系统中一些共享的资源。
Ø 单例类有如下特点:
§ 单例类只有一个实例。
§ 单例类自行创建并提供这个唯一的实例。
Ø 资源管理器一般做成单例模式。譬如每台计算机可以有若干个打印机,但只能有 一个Printer Spooler,以避免两个打印作业同时输出到打印机中。
Ø 单例模式有以下的特点:
§ 单例类只能有一个实例。
§ 单例类必须自己创建自己的惟一的实例。
§ 单例类必须给所有其他对象提供这一实例。
Ø 饿汉式单例类
Private static final EagerSingleton m_instance=new EagerSingleton();
Private EagerSingleton(){}
Public static EagerSingleton getInstance()
{
Return m_instance;
}
l 在这个类被加载时,静态变量
m_Instance会被初始化,此时
类的私有构造器会被调用。这
时候,单例类的惟一实例就被
创建出来了。
l Java语言中单例类的—个最重
要的特点是类的构造于是私有
的,从而避免外界利用构造子
直接创建出任意多的实例。
l 值得指出的是,由于构造于是
私有的,因此此类不能被继承。
Ø 懒汉式单例类
Public class LazySingleton
{
Private Static LazySingleton
m_instance=null;
}
Private LazySingleton(){}
Synchronized public static LazySingleton
getInstance()
{
If(m_instance==null)
{
m_instance=new LazySingleton();
}
Return m_instance;
}
l 静态工场方法使用了同步化,
以处理多线程环境。
l 单从资源利用效率角度来讲,
这个比懒汉式单例类稍差些
l 从速度和反应时间角度来讲,
则比懒汉式单例类稍好。
l 然而,懒汉式单例类在实例
化时,必须处理好在多个线程
同时首 次引用此类时的访问
限制问题,特别是当单例类作
为资源控制器在实例化时必然
涉及资源初始化.而资源初始
化很有可能耗费时问。这意味
着出现多线程同时首次引用此
类的几率变得较大。
具体的一个例子:
class Singleton{
private static Singleton onlyone =
new Singleton();
private int value;
public static Singleton getSingle() {
return onlyone;
}
private Singleton() {}
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
}
class Singleton{
private static Singleton onlyone = null;
private int value;
public static Singleton getSingle() {
if(onlyone==null){
onlyone = new Singleton();
}
return onlyone;
}
private Singleton() {}
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
}
public class Test {
public static void main(String args[]){
Singleton s1 = Singleton.getSingle();
Singleton s2 = Singleton.getSingle();
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
s1.setValue(100);
s2.setValue(200);
System.out.println(s1.getValue());
}
}
在什么情况使用单例模式
使用单例模式有 一个必要条件:在一个系统要求 一个类只有—个实例时才应当使用单例模式。反过来说,如果一个类可以有几个实例共存.那么就没有必要使用单例类。
相关文章推荐
- ubuntu文件目录详细介绍
- Linux编辑器vi使用方法详细介绍
- Iocomp 工业仪表盘控件包VCL详细介绍
- 你的博客赚钱了吗?博告网详细介绍
- jquery的each()详细介绍
- Reports Starter Kit详细介绍(一)
- 安卓HBOOT界面详细介绍
- Reports Starter Kit详细介绍(二)
- 详细介绍Linux shell脚本基础学习(二)
- js中的json对象详细介绍
- Neodynamic WPF条码识别控件详细介绍
- C语言 数据类型详细介绍
- Java 基础之事务详细介绍
- C语言 运算符详细介绍及示例代码
- RabbitMQ学习总结(1)——基础概念详细介绍
- 电子表格控件Spreadsheet 对象方法事件详细介绍
- TrustRank算法详细介绍
- java类加载器的父亲委托机制详细介绍
- 芯片封装详细介绍
- OkHttp3详细介绍—— Android(一)