可分为eager模式,示例代码如下:
Java代码
1.class EagerSingleton{
2. private static final EagerSingleton m_instance = new EagerSingleton()
3. private EagerSingleton(){}
4. public static EagerSingleton getInstance(){
5. return m_instance
6. }
7.}
class EagerSingleton{
private static final EagerSingleton m_instance = new EagerSingleton()
private EagerSingleton(){}
public static EagerSingleton getInstance(){
return m_instance
}
}
和 lazy模式,示例代码如下:
Java代码
1.class LazySingleton{
2. private static LazySingleton m_instance = null
3. private LazySingleton(){}
4. public synchronized static getInstance(){
5. if(m_instance == null){
6. m_instance = new LazySingleton()
7. }
8. return m_instance
9. }
10.}
class LazySingleton{
private static LazySingleton m_instance = null
private LazySingleton(){}
public synchronized static getInstance(){
if(m_instance == null){
m_instance = new LazySingleton()
}
return m_instance
}
}
java源码中,Runtime.getRuntime()就是单例的一个例子。
单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton)。
多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。
示例代码如下:
Java代码
1.class Multiton{
2. private final int INSTANCE_SIZE = 10
3. private static Map instances = new HashMap(INSTANCE_SIZE)
4. private String name
5. private Multiton(){}
6. private Multiton(String name){
7. this.name = name
8. }
9. public synchronized static getInstance(String name){
10. if(instances.containsKey(name)){
11. return instances.get(name)
12. }
13. else{
14. ins = new Multiton(name)
15. instances.put(name, ins)
16. return ins
17. }
18. }
19.}
class Multiton{
private final int INSTANCE_SIZE = 10
private static Map instances = new HashMap(INSTANCE_SIZE)
private String name
private Multiton(){}
private Multiton(String name){
this.name = name
}
public synchronized static getInstance(String name){
if(instances.containsKey(name)){
return instances.get(name)
}
else{
ins = new Multiton(name)
instances.put(name, ins)
return ins
}
}
}
[nextpage]
一个实用的例子就是KeyGenerator, 示例代码如下:
Java代码
1.class KeyGenerator{
2. private final int POOL_SIZE = 20
3. private static Map instances = new HashMap(16)
4. private KeyInfo keyinfo
5. private KeyGenerator(){}
6. private KeyGenerator(String keyName){
7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName)
8. }
9. public synchronized static getInstance(String keyName){
10. if(instances.containsKey(keyName)){
11. return (KeyGenerator)instances.get(keyName)
12. }
13. else{
14. keyGen = new KeyGenerator(keyName)
15. instances.put(name, keyGen)
16. return keyGen
17. }
18. }
19. public synzhronized int getNextKey(){
20. return keyinfo.getNextKey()
21. }
22. }
class KeyGenerator{
private final int POOL_SIZE = 20
private static Map instances = new HashMap(16)
private KeyInfo keyinfo
private KeyGenerator(){}
private KeyGenerator(String keyName){
this.keyinfo = new KeyInfo(POOL_SIZE, keyName)
}
public synchronized static getInstance(String keyName){
if(instances.containsKey(keyName)){
return (KeyGenerator)instances.get(keyName)
}
else{
keyGen = new KeyGenerator(keyName)
instances.put(name, keyGen)
return keyGen
}
}
public synzhronized int getNextKey(){
return keyinfo.getNextKey()
}
}
1. 说明1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例
2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式)
3)单例模式要素:
a)私有构造方法
b)私有静态引用指向自己实例
c)以自己实例为返回值的公有静态方法
2.实例
饿单例模式:
复制代码代码如下:
package com.wish.modedesign
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton()
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
return instance
}