JAVA单例模式的几种实现方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA单例模式的几种实现方法相关的知识,希望对你有一定的参考价值。
JAVA单例模式的几种实现方法
1.饿汉式单例类
package
pattern.singleton;
//
饿汉式单例类
.
在类初始化时,已经自行实例化
public
class
Singleton1
//
私有的默认构造子
private
Singleton1()
//
已经自行实例化
private
static
final
Singleton1
single
=
new
Singleton1();
//
静态工厂方法
public
static
Singleton1
getInstance()
return
single;
2.
懒汉式单例类
package
pattern.singleton;
//
懒汉式单例类
.
在第一次调用的时候实例化
public
class
Singleton2
//
私有的默认构造子
private
Singleton2()
//
注意,这里没有
final
private
static
Singleton2
single;
//
只实例化一次
static
single
=
new
Singleton2();
//
静态工厂方法
public
synchronized
static
Singleton2
getInstance()
if
(single
==
null
)
single
=
new
Singleton2();
return
single;
在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用所谓的
"
双重检查成例
".
必须指出的是,
"
双重检查成例
"
不可以在
Java
语言中使用。不十分熟悉的读者,可以看看后面给出的小节。
同
样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉
式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,
则
比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处
理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源
初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。
饿汉式单例类可以在
Java
语言内实现,
但不易在
C++
内实现,因为静态初始化在
C++
里没有固定的顺序,因而静态的
m_instance
变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么
GoF
在提出单例类的概念时,举的例子是懒
汉式的。他们的书影响之大,以致
Java
语言中单例类的例子也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合
Java
语
言本身的特点。
3.
登记式单例类
.
package
pattern.singleton;
import
java.util.HashMap;
import
java.util.Map;
//
登记式单例类
.
//
类似
Spring
里面的方法,将类名注册,下次从里面直接获取。
public
class
Singleton3
private
static
Map<String,Singleton3>
map
=
new
HashMap<String,Singleton3>();
static
Singleton3
single
=
new
Singleton3();
map.put(single.getClass().getName(),
single);
//
保护的默认构造子
protected
Singleton3()
//
静态工厂方法
,
返还此类惟一的实例
public
static
Singleton3
getInstance(String
name)
if
(name
==
null
)
name
=
Singleton3.
class
.getName();
System.out.println("name
==
null"+"--->name="+name);
if
(map.get(name)
==
null
)
try
map.put(name,
(Singleton3)
Class.forName(name).newInstance());
catch
(InstantiationException
e)
e.printStackTrace();
catch
(IllegalAccessException
e)
e.printStackTrace();
catch
(ClassNotFoundException
e)
e.printStackTrace();
return
map.get(name);
//
一个示意性的商业方法
public
String
about()
return
"Hello,
I
am
RegSingleton.";
public
static
void
main(String[]
args)
Singleton3
single3
=
Singleton3.getInstance(
null
);
System.out.println(single3.about());
参考技术A 三种,懒汉,饿汗,饥渴汗 参考技术B 2 种
以上是关于JAVA单例模式的几种实现方法的主要内容,如果未能解决你的问题,请参考以下文章