状態パターンでは、状態オブジェクトを使用してオブジェクトの状態を表現します。これらの状態オブジェクトは特定の状態を表しますが、独自の可変状態はありません。これは、それらが決して変わらないことを意味します。したがって、任意の数のオブジェクトが同時に同じ状態オブジェクトを使用できます (異なるスレッドからであっても)。状態オブジェクトに変更可能な状態がある場合、他のオブジェクトは、状態オブジェクトが他の場所から変更されることを心配する必要があります。
1 つのオブジェクト インスタンスを他の多くのインスタンスで使用することは、flyweight-patternのインスタンスと見なすことができます。
あなたの質問の2番目の部分については、ここに例があります:
class SomeStateMachine;
class AbstractState {
// abstract baseclass for all state-classes
void input(const std::string & data, SomeStateMachine & caller) = 0;
}
class FinalState : public AbstractState {
FinalState * getInstance(); // always returns same instance
}
class InitialState : public AbstractState {
public:
InitialState * getInstance(); // always returns same instance
void input(const std::string & data, SomeStateMachine & caller) {
std::cout << data << std::endl;
caller.m_State = FinalState::getInstance();
}
}
class SomeStateMachine {
public:
SomeStateMachine() : m_State(InitialState::getInstance())
void input(const std::string & data) {
m_State->input(data, *this);
}
private:
friend class InitialState;
AbstractState * m_State;
};
したがって、基本的に呼び出し元オブジェクトへの参照を状態オブジェクトのすべてのメソッドに渡します。このようにして、状態オブジェクトは必要に応じて呼び出し元の状態を変更できます。この例はあまり美しくないかもしれませんが、理解していただければ幸いです。