单例模式的两种实现

Singleton模式

当要使用单例模式时,最常用的是Singleton模式:

public class Singleton {
	private static Singleton theInstance = null;
	private Singleton(){}
	public static Singleton Instance(){
		if(theInstance == null)
			theInstance = new Singleton();
		return theInstance;
	}
}

 优点:

  1. 跨平台:使用合适的中间件(例如RMI),可以把Singleton模式扩展为跨多个JVM和多个计算机工作。
  2. 适用于任何类:只需要把一个类的构造函数变成私有的,并且在其中增加相应的静态函数和变量,就可以把这个类变为Singleton。
  3. 可以透过派生创建:给定一个类,可以创建它的一个Singleton子类。
  4. 延迟求值:如果Singleton为被使用过,那么就决不会创建它。

 缺点: 

  1. 摧毁方法未定义:没有好的方法去摧毁一个Singleton,或者解除其职责。即使添加一个decommission方法把theInstance转为null,系统中的其他模块仍然持有对该Singleton实例的引用。这样,随后对Instance方法的调用会创建另外一个实例,致使同时存在两个实例。这个问题在C++中成为严重,因为实例可以被摧毁,可能会导致去提领一个已被摧毁的对象。
  2. 不能继承:从Singleton类派生出来的类并不是。如果要使其dnylSingleton,必须要增加所需的静态函数和变量。
  3. 效率问题:每次调用Instance方法都会执行if语句。就大多数调用而言,if语句是多余的。
  4. 不透明性:Singleton的使用都知道它们正在使用一个Singleton,因为它们必须要调用Instance方法。

Monostate模式

单例的另一种实现是Monostate模式,

 

public class MonoState {
	private static int x = 0;
	public MonoState(){}
	public void setX(int x){
		this.x = x;
	}
	public int getX(){
		return x;
	}
}

 

  无论创建了多少Monostate实例,他们都表现得像一个对象一个。这就是两个模式的区别,一个关注行为,一个关注结构。Singelton模式强制结构上的单一性。它防止创建出多个对象实例,相反,Monostate模式则强制行为上的单一性,而不有强加结构方面的限制。Monostate的测试用例对Singleton都是有效的,但Singleton的测试用例却不适用于Monostate类。

优点:

 

  1. 透明性:使用Monostate对象和使用常规对象没有什么区别。使用者不需要知道对象是Monostate。
  2. 可派生性:Monostate的派生类都是Monostate。事实上,Monostate的所有派生类都是同一个Monostate的一部分。它们共享相同的静态变量。
  3. 多太性:由于Monostate的方法不是静态的,所以可以在派生类中复写它们。因此,不同的派生类可以基于同样 的静态变量表现出不同的行为。

缺点:

 

  1. 不可黑气性:不能透过派生把常规类转换成Monosate类。
  2. 效率问题:因为Monostate是真正的对象,所以会导致许多 的创建和摧毁开销。
  3. 内存占用:即使从未使用Monostate,它的变量也要占据内存空间。
  4. 平台局限性:Monostate不能跨过多个JVM或者多个平台工作。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值