Jednym ze sposobów jest przeprojektowanie klasy nieco inaczej. Rozważ prostą klasę bazy danych, która musi zostać zainicjowana przed użyciem. Jestem facetem Javy, więc ...
public class Database {
public void init(String username, String password) // must call this first!
public List<Object> runQuery(String sql) // ...
}
Muszę najpierw wywołać init. Mogę utworzyć DatabaseFactory, który inicjuje i zwraca rzeczywisty obiekt bazy danych. Możemy ukryć konstruktor, aby tylko DatabaseFactory mógł utworzyć bazę danych (w Javie jest klasą zagnieżdżoną, w C++ może być klasa przyjaciół?).
public class DatabaseFactory {
public Database init(String username, String password) // ...
public class Database {
private Database() {}
public List<Object> runQuery(String sql) // ...
}
}
Teraz muszę przejść przez fabrykę, aby dostać się do ukrytego obiektu.
DatabaseFactory factory = new DatabaseFactory();
Database database = factory.init("username", "password"); // first init (call method A)
// now I can use database (or B in your case)
database.runQuery("select * from table");
nie można naprawdę egzekwować zamówienia (masz już wymienione rozwiązanie). Możesz ponownie zaprojektować wzór szablonu i uniknąć tej szczególnej potrzeby. http://pl.wikipedia.org/wiki/Template_method_pattern – Jayan