单例模式代码怎么写?

Python018

单例模式代码怎么写?,第1张

 单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例

可分为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

}