Sto sviluppando COM. Una fabbrica deve essere inizializzata prima fornendo un ID. Non posso passare argomenti all'istanza IFactory tramite CoCreateInstance. Quindi IFactory potrebbe aver bisogno di aggiungere un metodo init per essere chiamato allora. (come approccio 2)
Non voglio richiedere al client di chiamare init esplicitamente (potrebbero dimenticare). In modo che aggiungo un livello chiamato IEntryPoint . Ciò garantisce che GetFactory restituisca un IFactory verificato senza prima chiamato init . Quindi l'istanza IFactory non avrà lo stato che indica che è valido o non valido. Tutti i suoi metodi possono essere const. (come approccio 1)
È incapsulato se IEntryPoint ha solo il metodo GetFactory ?
Approccio 1:
IEntryPoint::GetFactory assicura IFactory istanza è valida se viene restituito S_OK .
interface IEntryPoint
{
HRESULT GetFactory(size_t id, IFactory** ppFactory) const;
};
interface IFactory
{
HRESULT GetInstance(size_t id, IInstance** ppInstance) const;
};
interface IInstance
{
HRESULT Getter1() const;
HRESULT Getter2() const;
HRESULT Getter3() const;
};
vs
Approccio 2:
% istanza diIFactory richiede al client di chiamare prima init .
interface IFactory
{
HRESULT Init(size_t id);
HRESULT GetInstance(size_t id, IInstance** ppInstance) const;
};
interface IInstance
{
HRESULT Getter1() const;
HRESULT Getter2() const;
HRESULT Getter3() const;
};