147 lines
12 KiB
Plaintext
147 lines
12 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| A B S T R A C T F A C T O R Y C R E A T I O N A L |
|
|
//| |
|
|
//| Provides an interface for creating families of related or |
|
|
//| dependent objects without specifying their concrete class. |
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| P R O D U C T A I N T E R F A C E |
|
|
//+------------------------------------------------------------------+
|
|
interface I_ProductA { void Act(); };
|
|
//+------------------------------------------------------------------+
|
|
//| P R O D U C T B I N T E R F A C E |
|
|
//+------------------------------------------------------------------+
|
|
interface I_ProductB { void Act(); };
|
|
//+------------------------------------------------------------------+
|
|
//| F A C T O R Y I N T E R F A C E |
|
|
//+------------------------------------------------------------------+
|
|
interface I_Factory
|
|
{
|
|
I_ProductA *MakeProductA();
|
|
I_ProductB *MakeProductB();
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| P R O D U C T A 1 C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_ProductA1 : public I_ProductA
|
|
{
|
|
public:
|
|
C_ProductA1() { Print(" • Product A1 constructed"); }
|
|
~C_ProductA1() { Print(" • Product A1 destructed"); }
|
|
void Act() { Print(" • Doing A1 operation"); }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| P R O D U C T A 2 C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_ProductA2 : public I_ProductA
|
|
{
|
|
public:
|
|
C_ProductA2() { Print(" • Product A2 constructed"); }
|
|
~C_ProductA2() { Print(" • Product A2 destructed"); }
|
|
void Act() { Print(" • Doing A2 operation"); }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| P R O D U C T B 1 C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_ProductB1 : public I_ProductB
|
|
{
|
|
public:
|
|
C_ProductB1() { Print(" • Product B1 constructed"); }
|
|
~C_ProductB1() { Print(" • Product B1 destructed"); }
|
|
void Act() { Print(" • Doing B1 operation"); }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| P R O D U C T B 2 C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_ProductB2 : public I_ProductB
|
|
{
|
|
public:
|
|
C_ProductB2() { Print(" • Product B2 constructed"); }
|
|
~C_ProductB2() { Print(" • Product B2 destructed"); }
|
|
void Act() { Print(" • Doing B2 operation"); }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| F A C T O R Y 1 C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_Factory1 : public I_Factory
|
|
{
|
|
public:
|
|
C_Factory1() { Print("Factory 1 constructed"); }
|
|
~C_Factory1() { Print("Factory 1 destructed"); }
|
|
I_ProductA* MakeProductA() { return new C_ProductA1; }
|
|
I_ProductB* MakeProductB() { return new C_ProductB1; }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| F A C T O R Y 2 C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_Factory2 : public I_Factory
|
|
{
|
|
public:
|
|
C_Factory2() { Print("Factory 2 constructed"); }
|
|
~C_Factory2() { Print("Factory 2 destructed"); }
|
|
I_ProductA *MakeProductA() { return new C_ProductA2; }
|
|
I_ProductB *MakeProductB() { return new C_ProductB2; }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| C L I E N T C L A S S |
|
|
//+------------------------------------------------------------------+
|
|
class C_Client
|
|
{
|
|
public:
|
|
C_Client(I_Factory *factory)
|
|
{
|
|
m_factory=factory;
|
|
m_product_a=m_factory.MakeProductA();
|
|
m_product_b=m_factory.MakeProductB();
|
|
}
|
|
~C_Client()
|
|
{
|
|
if(CheckPointer(m_product_a)==POINTER_DYNAMIC) delete m_product_a;
|
|
if(CheckPointer(m_product_b)==POINTER_DYNAMIC) delete m_product_b;
|
|
if(CheckPointer(m_factory)==POINTER_DYNAMIC) delete m_factory;
|
|
}
|
|
//---
|
|
void Act() { m_product_a.Act(); m_product_b.Act(); }
|
|
|
|
protected:
|
|
I_Factory *m_factory;
|
|
I_ProductA *m_product_a;
|
|
I_ProductB *m_product_b;
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| S C R I P T |
|
|
//+------------------------------------------------------------------+
|
|
void OnStart()
|
|
{
|
|
C_Client *client;
|
|
//---
|
|
client=new C_Client(new C_Factory1);
|
|
client.Act();
|
|
delete client;
|
|
//---
|
|
client=new C_Client(new C_Factory2);
|
|
client.Act();
|
|
delete client;
|
|
}
|
|
//--- OUTPUT
|
|
/*
|
|
Factory 1 constructed
|
|
• Product A1 constructed
|
|
• Product B1 constructed
|
|
• Doing A1 operation
|
|
• Doing B1 operation
|
|
• Product A1 destructed
|
|
• Product B1 destructed
|
|
Factory 1 destructed
|
|
Factory 2 constructed
|
|
• Product A2 constructed
|
|
• Product B2 constructed
|
|
• Doing A2 operation
|
|
• Doing B2 operation
|
|
• Product A2 destructed
|
|
• Product B2 destructed
|
|
Factory 2 destructed
|
|
*/
|
|
//+------------------------------------------------------------------+
|