Public class factory
{
Public Virtual void free ()
{
Console. writeline ("factory. Free ");
}
Public Virtual void Init ()
{
Console. writeline ("factory. init ");
}
Public Virtual void execute ()
{
Console. writeline ("factory. Execute ");
}
}
Public class factory1: Factory
{
Public override void free ()
{
Base. Free ();
Console. writeline ("factory1.free ");
}
Public override void Init ()
{
Base. INIT ();
Console. writeline ("factory1.init ");
}
}
Public class factory2: Factory
{
Public override void free ()
{
Base. Free ();
Console. writeline ("factory2.free ");
}
Public override void Init ()
{
Base. INIT ();
Console. writeline ("factory2.init ");
}
}
Public class Server
{
Public void freeserver ()
{
Manager. foreachfactory (this, new manager. facotrypro (factoryfree ));
}
Public void initserver ()
{
Manager. foreachfactory (this, new manager. facotrypro (factoryinit ));
}
Public void execute ()
{
Manager. foreachfactory (this, new manager. facotrypro (factoryexecte ));
}
Protected void factoryexecte (factory)
{
Factory. Execute ();
}
Protected void factoryfree (factory)
{
Factory. Free ();
}
Protected void factoryinit (factory)
{
Factory. INIT ();
}
}
Public class Manager
{
Public Delegate void facotrypro (factory );
Public static factory [] getfactories () {return new factory [] {New factory1 (), new factory2 ()};}
Public static void foreachfactory (server, facotrypro factorypro)
{
Factory [] factories = getfactories ();
Foreach (factory in factories)
{
Factorypro (factory );
}
}
}
Class Application
{
[Stathread]
Static void main (string [] ARGs)
{
Server curserver = new server ();
Console. writeline ("begin server init ...");
Curserver. initserver ();
Console. writeline ("execute ...");
Curserver. Execute ();
Console. writeline ("begin server free ...");
Curserver. freeserver ();
Console. Read ();
}
}
// Output results