在软件设计中,有时确实存在一个类仅能用来产生一个唯一对象的必要性。例如,一个大公司的打印室虽然可以有多台打印机,但是其打印管理系统中只有一个打印任务控制对象,该对象管理打印排队并分配打印任务给各打印机。再如,在WIndows系统中,应该只有一个文件系统与一个文件管理系统(Windows Manager)。
怎样才能确保一个类只有一个实例?有两种方法解决该问题,一个是程序员在应用程序中使用代码保证仅有一个实例被创建,另外一种方法是不依靠应用程序员,而是精心设计需要仅有一个实例的类,由该类本身的结构确保其仅能够被创建一个实例。实践证明,第二个方法从根本上上保证仅有一个实例被创建的有效方法。这就是单例模式(Singleton Pattern)所要表述的内容。
单例模式(Singleton Pattern),属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)
为了防止客户程序利用构造方法创建多个对象,将构造方法声明为private 类型。其原因是,如果构造方法是public 类型的,则客户程序永远可以使用该构造方法创建不同对象。但这样做的问题是,如果一个类的构造方法是private 类型的,其他类就无法使用该构造方法来创建对象,从而该类就成为一个不可用的类。
为了解决这个问题,该类必须提供一个获得实例的方法,通常称为getInstance() 方法。该方法返回一个类的实例。值得注意的是,该方法必须是静态方法,否则客户端将无法调用该方法。应该确保无论客户程序调用该getInstance() 方法多少次,得到的始终是同一个对象。
为了满足上述要求,可将一个希望客户类仅能创建一个实例的类President 设计如下:
public class President {
private static President instance;
private String name;
private President(String name) {
this.name = name;
}
public static Singleton getInstance(String name) {
if(instance == null&&!name.equals(null))//1
instance = new President(String name);//2
return instance;//3
}
}
以上类的设计保证了仅有一个President 对象被创建。
单例模式结构类图:
1. 单例模式的优点
举世皆浊我独清,众人皆醉我独醒
因篇幅问题不能全部显示,请点此查看更多更全内容