存档: 标签: ‘Pattern’

Java设计模式之Singleton

2 条评论 2010年7月9日

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 singleton能够被状态化也能被无状态化,通常是用在工具类里,实现单线程的操作。

第一种:注册型的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class RegSingleton {
	static private HashMap m_registry = new HashMap();
	static {
		RegSingleton x = new RegSingleton();
		m_registry.put(x.getClass().getName(), x);
	}
 
	protected RegSingleton() {
	}
 
	static public RegSingleton getInstance(String name) {
		if (name == null) {
			name = "RegSingleton";
		}
		if (m_registry.get(name) == null) {
			try {
				m_registry.put(name, Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		return (RegSingleton) (m_registry.get(name));
	}
}

第一种:饥渴型的模式:

1
2
3
4
5
6
7
8
9
10
public class EagerSingleton {
	private static final EagerSingleton m_instance = new EagerSingleton();
 
	private EagerSingleton() {
	}
 
	public static EagerSingleton getInstance() {
		return m_instance;
	}
}

第一种:懒汉型的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LazySingleton {
	private static LazySingleton m_instance = null;
 
	private LazySingleton() {
	}
 
	public static LazySingleton getInstance() {
		if (m_instance == null) {
			synchronized (LazySingleton.class) {
				if (m_instance == null) {
					m_instance = new LazySingleton();
				}
			}
		}
		return m_instance;
	}
}

第一种方式很少有人使用,因为其没有考虑到多线程并发的情况;第二种方式,在自己内部定义自己一个实例,并提供了一个供外部访问本class的静态方法;第三种方式不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率!仔细看第三种方式,其采用了双重验证m_instance是否为空的方式,并且在方法内部对对象加了同步方法。这种方式看清来万无一失,其实还是有欠妥的地方,深究下去,这就涉及到到double-checked locking (DCL)的讨论。具体讨论,可以参照以下文档:
Double-checked locking and the Singleton pattern
When is a singleton not a singleton?
从上面的文章,可以知道第三种方式并不能解决问题,在第三种方式的方法里设置临时变量也不能解决问题(因为虚拟机会进行优化操作),使用volatile 关键字也不是可靠的方法(因为不同虚拟机对其实现不一致),最可靠的的方法也是最初最容易想到和写出的方法也就是对方法加同步锁。虽然,对整个方法加同步锁,会耗很多资源,但是保证线程安全最可靠的方法了。
最可靠的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class LazySingleton {
	private static LazySingleton m_instance = null;
 
	private LazySingleton() {
	}
 
	public synchronized static LazySingleton getInstance() {
		if (m_instance == null) {
			m_instance = new LazySingleton();
		}
		return m_instance;
	}
}

23中设计模式——-轻松的比喻语言

1条评论 2009年9月16日

创建型模式
1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory
工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每 种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱 你”builder。(这一定比美军在伊拉克用的翻译机好卖)
建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 继续阅读…