java与模式4:单例模式

设计模式4:单例模式
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
其详细内容可以简单的分为两种:
1)饿汉式单利模式(java编程中推荐使用此模式),特征:
a.在一个私有的静态变量中进行实例化
b.构造函数是私有的
c.在一个静态方法中返回该类的实例(即前面声明的静态变量),外部类通过这个静态的方法得到该类的实例
d.因为在系统中始终有一个自己的引用,所以实例对象不会被垃圾收集器收回,将在系统中一直存在直到系统重启。
示例代码如下:

[code lang=”java”]
public class EargerSingleton {
// 私有静态属性
private static final EargerSingleton eargerSingleton = new EargerSingleton();
private EargerSingleton() {
}
public static EargerSingleton getInstance() {
return eargerSingleton;
}
}
[/code]

2.懒汉式单例模式,特征:与饿汉式单例模式基本相同,不同的是实例的获得是在该类被第一次引用时。
示例代码如下:

[code lang=”java”]
public class LazySigleton {
private static LazySigleton lazySigleton = null;

private LazySigleton() {
}

synchronized public static LazySigleton getInstance() {
if (lazySigleton == null) {
lazySigleton = new LazySigleton();
}
return lazySigleton;
}
}
[/code]

注意上面的懒汉模式中使用了同步锁(synchronized),是为了防止在多线程使用时可能同时初始化多个实例的情况出现。在资源利用上懒汉模式比饿汉模式要好一些,但是在速度和反应时间上则逊色于饿汉模式。
由于这两种模式的构造方法都是私有的,导致这两个类都是不能被继承的。
3.登记式单例模式。为了解决前两者的类不能被继承而设计。
示例代码:

[code lang=”java”]
public class RegSingleton {
static private HashMap<String, RegSingleton> regMap = new HashMap<String, RegSingleton>();
static {
RegSingleton regSingleton = new RegSingleton();
regMap.put(regSingleton.getClass().getName(), regSingleton);
}

/**
* 受保护的默认构造函数
*/
protected RegSingleton() {

}

public static RegSingleton getInstance(String name) {
if ("".equals(name) || null == name) {
name = "gof.singleton.RegSingleton";

}
if (regMap.get(name) == null) {

try {
regMap.put(name, (RegSingleton) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return regMap.get(name);

}
}
[/code]

使用单例模式的条件:一个系统要求一个类只有一个实例的时候才使用该模式。
如果一个系统中单例类已经被使用,而在这个时候又想得到这个类的多个实例时,那么就可以采用多例模式.

多例模式,是对单例模式的推广:
特征:
1)。多例类可以有多个实例
2)多例类必须自己创建,自己管理自己的实例,并向外界提供自己的实例
举例如:打麻将每一局都需要两个骰子,因为骰子是相同的,但是只需要两个实例,那么骰子的实现类中就可以有两个实例出现,代码如下:

[code lang=”java”]
public class Die{
private static Die die1 = new Die();
private static Die die2 = new Die();
//下面进行类似饿汉单例模式的实现
}
[/code]

当多例模式里需要管理的实例较多时可以参考下面的类进行管理:

[code lang=”java”]
public class LingualResource {
// 属性声明
private String language = "en";
private String region = "US";
private String localeCode = "en_US";
private static HashMap instances = new HashMap(19);
private static String FILE_NAME = "res";
private Locale locale = null;
private ResourceBundle resourceBundle = null;
private LingualResource lnkLingualResource;

// 私有构造方法
private LingualResource() {
}

/**
* @param language
* @param region2
*/
private LingualResource(String language, String region2) {
this.localeCode = language;
this.region = region2;
localeCode = makeLocaleResource(language, region2);
locale = new Locale(language, region2);
resourceBundle = ResourceBundle.getBundle(FILE_NAME, locale);
instances.put(makeLocaleResource(language, region2), resourceBundle);
}

public static synchronized LingualResource getInstance(String language,
String region) {
String localeCode = makeLocaleResource(language, region);
if (instances.get(localeCode) != null) {
return (LingualResource) instances.get(localeCode);
} else {
return new LingualResource(language, region);
}

}
private static String makeLocaleResource(String language, String region) {
return language + "_" + region;
}
}
[/code]
设计模式学习列表:Java设计模式学习笔记

张贴在未分类

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注