单态模式限制了类实例的创建,但采用这种模式设计的类,可以保证仅有一个实例,并可提供访问该实例的全局访问点。J2 EE 应用的大量组件,都需要保证一个类只有一个实例。比如数据库引擎访问点只能有一个。
更多的时候,为了提高性能,程序应尽量减少 Java 对象的创建和销毁时的开销。使用单态模式可避免 Java类被多次实例化,让相同类的全部实例共享同一内存区。为了防止单态模式的类被多次实例化,应将类的构造器设成私有,这样就保证了只能通过静态方法获得类实例。而该静态方法则保证每次返回的实例都是同一个,这就需将该类的实例设置成类属性,由于该属性需要被静态方法访问,因此该属性应设成静态属性。
下面给出单态模式的示例代码:
public class SingletonTest { /** * @param args */// 该类的一个普通属性。 int value; //使用静态属性类保存该类的一个实例。 private static SingletonTest instance; //构造器私有化,避免该类被多次实例。 private SingletonTest(){ System.out.println("正在执行构造器...,,"); } //提供静态方法来返回该类的实例。 public static SingletonTest getInstance(){ //实例化类实例前,先检查该类的实例是否存在 if (instance == null) //如果不存在,则新建一个实例。 instance = new SingletonTest(); //返回该类的成员变量:该类的实例。 return instance; } public int getValue(){ return value; } public void setValue(int values){ this.value = values; } public void print(){ System.out.println(value); } public static void main(String[] args) { // TODO Auto-generated method stub SingletonTest tl = SingletonTest .getInstance(); SingletonTest t2 = SingletonTest .getInstance(); t2.setValue(9); t2.print(); System.out.println(tl == t2); tl.print(); }
结果:
正在执行构造器...,,
9
true
9
上面如果注释掉if (instance == null).则结果为:
正在执行构造器...,,
正在执行构造器...,,
9
false
0
从程序最后的打印结果可以看出,该类的两个实例完全相同。这证明单态模式类的全部实例是同一共享实例。程序里虽然获得了类的两个实例,但实际上只执行一次构造器,因为对于单态模式的类,无论有多少次的创建实例请求,都只执行一次构造器。
相关资源:单态登录——只能在一个机器上登录(完整实例)