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;
};