敏捷软件开发 - 原则、模式与实践 —— 设计模式(四)SINGLETON模式和MONOSTATE模式

本文探讨了SINGLETON和MONOSTATE模式,用于确保对象的单一性。SINGLETON模式通过私有构造函数和静态方法实现跨平台的单一实例,而MONOSTATE模式则通过共享静态状态提供透明性和多态性。

本文为敏捷软件开发 - 原则、模式与实践系列的一部分。

本文对应原书第16章

介绍

本节讲述了两个强制对象单一性的模式。这两个模式有着非常不同的“代价/收益”权衡。在大多数情况下,它们的实时代价远低于它们的表达力带来的收益。

SINGLETON模式

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

上面是一个典型的有点瑕疵的SINGLETON实现

SINGLETON模式的好处
  • 跨平台:使用合适的中间件(例如,RMI),可以把SINGLETON模式扩展为跨多个JVM和多个计算机工作。

  • 适用于任何类:只需把一个类的构造函数变成私有的,并且在其中增加相应的静态函数和变量,就可以把这个类变为SINGLETON。

  • 可以透过派生创建:给定一个类,可以创建它的一个SINGLETON子类。
    延迟求值:如果SINGLETON从未使用过,那么就不会创建它。

SINGLETON模式的代价
  • 摧毁方法未定义:没有好的办法去摧毁一个SINGLETON,或者解除其职责。

  • 不能继承:从SINGLETON类派生出来的类并不是SINGLETON。如果要使其成为SINGLETON,必须要增加所需的静态函数和变量。

  • 效率问题:每次调用Instance方法都会执行if语句。就大多数调用而言,if语句是多余的。

  • 不透明性:SINGLETON的使用者知道它们正在使用一个SINGLETON,因为它们必须要调用Instance方法。

MONOSTATE模式

public class Monostate {  
	private static int itsX;
	public Monostate() {}

	public void setX(int x) {
		itsX = x;
	}

	public int getX() {
		return itsX;
	}
}
MONOSTATE模式的好处
  • 透明性:使用MONOSTATE对象和使用常规对象没有什么区别。使用者不需要知道对象是MONOSTATE。

  • 可派生性:MONOSTATE的派生类都是MONOSTATE。事实上,MONOSTATE的所有派生类都是同一个MONOSTATE的一部分。它们共享相同的静态变量。

  • 多态性:由于MONOSTATE的方法不是静态的,所以可以在派生类中覆写它们。因此,不同的派生类可以基于同样的静态变量表现出不同的行为。

MONOSTATE模式的代价
  • 不可转换性:不能透过派生将常规类转换为MONOSTATE类。

  • 效率问题:因为MONOSTATE是真正的对象,所以会导致许多的创建和摧毁开销。

  • 内存占用:即使从未使用MONOSTATE,它的变量也要占据内存空间。

  • 平台局限性:MONOSTATE不能跨多个JVM或者多个平台工作。

结论

常常会有必要强制要求某个特定对象只能具有单一实例。本章展示了两种非常不同的技术。SINGLETON模式使用私有构造函数,一个静态变量,以及一个静态方法对实例化进行控制和限制。MONOSTATE模式只是简单地把对象的所有变量变成静态的。

如果希望透过派生去约束一个现存类,并且不介意它的所有调用者都必须要调用instance()方法来获取访问权,那么SINGLETON是合适的。如果希望类的单一性本质对使用者透明,或者希望使用单一对象的多态派生类,那么MONOSTATE是最适合的。

完整内容请查看敏捷软件开发 - 原则、模式与实践系列

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值