http://www.zdnet.com.cn/developer/keywords/TonyPatton
应用开发作为一门学科逐渐成熟,设计模式也成为常见编程问题的解决方案。设计模式为富有经验的开发者提供一种分享他们久经时间考验的方法的途径,帮助每名开发者解决每天遇到的问题。我将探讨如何在开发过程中应用设计模式,并特别强调.NET单态模式。
代码在哪?
设计模式代表处理并解决问题的一种手段,它并不能提供一个解决一切问题的强大代码库,那些认为自己不需要再学习编码的开发者对此会感到很失望。
应用单态模式
.NET单态模式是今天最有常用也最为简单易懂的设计模式之一。尽管它也会有些复杂,但它的基本前提是简单的:只允许建立一个对象的一个实例。此概念适用于许多设计情形。
例如,你可能只有一个处理系统某些方面的计算器类,要维持有效计算,你只想要(或需要)这个对象的一个实例。另外,你可能希望将一个特殊窗体中打开的子窗体数量限制为1个。子窗体可应用一个只允许一个实例的类(由基本窗体衍生出来)。
你可能想了解,你是否可以用一个静态的类或方法达到同样的结果。如果类确实需要存入内存并保持某种状态,单态是一个不错的选择。在计算器类中,你可能倾向于使用一个静态全程变量,但它仅能解决一个问题:全程可访问性。它不能保证在特定时间只运行一个类的一个实例(不是在所有情形下都有必要)。只运行一个类的一个实例的责任应落在类本身,而非类用户身上。
给单态模式编码
在使用单态模式时,要注意以下几个问题:
- 该类有一个单独的构造器。它是专用的,且不接受参数(接受不同的参数可能会得到不同的结果)。专用的声明可防止其它类对其进行例示,这是对模式的违反。另外,专用的标签可防止子分类。由于子分类允许衍生类建立多个实例,所以这也是必要的。
- 该类有一个与单独类实例有关的静态变量。
- 该类有一个普遍有效的静态方法,可访问那个单独类实例。
这些指导方针的焦点在于执行一个单独的类实例。列表A中的C#代码定义了一个应用单态模式的类。列表B中为对应的VB.NET代码。
namespace Patterns {
public sealed class Singleton {
private static readonly Singleton instance = new Singleton();
private int count;
private Singleton() { }
public static Singleton Instance {
get {
return instance;
} }
public int Count {
get { return count++; }
} } }
关于此类的几点提示:
- 构造器是专用的,因此无法访问,所以用它也不能建立实例。
- 通用实例方法可访问对象实例。它通过包含实例的静态变量返回对象的唯一实例。
- 类的密封声明具有很强的破坏力。密封类用来限制面向对象编程的继承功能。一旦一个类被定义为密封类,此类就不能被继承。
- 计算器变量为专用变量,可通过通用方法进行访问。由于该类只有一个实例,所以该计算器也只有一个实例。
可用几种不同的方法给单态模式编码。上面的列表中应用的是一个实例静态对象,它总是存在。如果该对象从未使用,就会形成管理费用。因此,你可以应用列表C中的方法。列表D为对应的VB.NET代码。
public sealed class Singleton2 {
private static readonly Singleton2 instance = null;
private static bool flag = false;
private int count = 0;
private Singleton2() { }
public static Singleton2 GetInstance() {
if (!flag) {
instance = new Singleton2();
flag = true;
}
return instance;
}
public int Count {
get { return count++; }
} }
只有当(如果)GetInstance方法被调用时,第二个实例才会建立对象。因此,如果从不使用对象,就不会建立对象,这样就可节省系统资源。它应用一个静态标记变量来处理对象。
由于总是只有对象的一个实例,因此第一个方法常用来处理线程问题。在第二个实例中,线程可能会引起问题,导致每个线程出现单独实例。你可以进一步应用锁定的方法来控制创建对象,但在本文我们不讨论这个问题。为了保证线程安全,你应使用第二种方法。
结论
设计模式是一个大家熟悉的概念,它一直为开发社区所试验、测试、调整。单态设计模式是一个在应用中提供单一对象访问点的优秀方法。记得在今后的项目中应用单态模式,你可以找到许多适用单态模式的情形。