2012-01-18 61 views
1

这有点棘手。我在我的应用程序中使用状态模式来管理状态。我想在应用程序中拥有每个状态的单个实例,但我不想让每个状态类都作为单例类。我想到的另一种方法是编写一个StateLocator类。 StateLocator可以是单例,它可以保存所有状态的实例。请指导我判断StateLocator是否是一个好的解决方案,或者是否有其他解决方案,我仍然只能拥有一个状态实例,并且可能会避免单身人士。状态设计模式,但避免单身人士

任何帮助表示赞赏。例如

public interface TestState { 

    public void onTest(); 
    public void onApprove() 

} 

class StateA implements TestState { 
    public void onTest() { 
    } 
    public void onApprove() { 
    } 
} 

class StateB implements TestState { 
    public void onTest() { 
    } 
    public void onApprove() { 
    } 
} 

class StateLocator { 

    private StateA mStateA; 
    private StateB mStateB; 

    StateLocator() { 
     mStateA = new StateA(); 
     mStateB = new StateB(); 
    } 

    public TestState getState(int stateType) { 

     if(stateType == 1) { 
      return mStateA; 
     } else { 
     return mStateB; 
     } 
    } 
} 

回答

2

StateLocator,在你使用它的方式,是“注册表”模式

http://martinfowler.com/eaaCatalog/registry.html

知道也不关心你的设计,这是为了避免单身的好方法。注册表可能是单身人士(不一定是必须的)。

+0

我在这里看到的唯一不好的部分是StateLocator必须知道所有可能的状态。 StateLocator能够以任何方式了解可能的状态列表本身吗? – cppdev 2012-01-18 03:17:01

+0

如果你想让你的状态被发现,你可以在你有发布/订阅系统的地方使用观察者模式(如事件模型)。无论如何,这仍然需要所有状态被发现和激活。您可以使用反射来发现这些内容,并将其注册到发布/订阅模型。这可能是过度的。 – Dessus 2012-01-18 03:22:38

+1

注册表不一定必须知道所有的状态。它可能有一个按键的独特国家集合的抽象概念。所以.... locator.RegisterState(stateA,1);或者 – 2012-01-18 03:35:13