State模式中,应该有人注意到,修改前的编码内每次都要生成表示消息用的对象pr。
这样的话就又可能浪费了存储器。因此,只要存在只有一个对象的类的话就很方便了。把这个类的模式称为 Sigleton。
由于只要控制事例的数目,所以在类中用static。那么我们来看一下实际的Java编码。
源代码:
class PrintPanel{
void Print(String s){
System.out.println(s);
}
}
应用了Singleton模式的PrintPanel类:
class PrintPanel{
private static PrintPanel _instance;
public synchronized static PrintPanel instance(){
if (_instance == null){
_instance = new PrintPanel();
}
return _instance;
}
void Print(String s){
System.out.println(s);
}
protected PrintPanel(){}
}
这样的话,要求instance()时,只要已经生成instatnce,就能返回其对象。反之,则生成new PrintPanel()。
class EngineRunning extends EngineState{
PrintPanel pt = PrintPanel.instance();
void Up(EngineBoxeb){
pt.Print("No More Up");
eb.ChangeState(new EngineRunning());
}
void Down(EngineBox eb){
pt.Print("Down to idle from running");
eb.ChangeState(new EngineIdle());
}
void ShowCurrentState(){
pt.Print("State:running");
}
}
有关生成如上所述。
不是new生成的,而是作为PrintPabnel.instance()获得对象。Singleton模式的事例能够扩展到两个以上。在实际应用中,与这次的EngineBox一样,常常与其他模式配合起来使用。