Code in C#:
namespace
AbstractFactory_DesignPattern
{
using System;
// These classes could be part of a framework,
// which we will call DP
// ===========================================
abstract class DPDocument
{
abstract public void Dump();
}
abstract class DPWorkspace
{
abstract public void Dump();
}
abstract class DPView
{
abstract public void Dump();
}
abstract class DPFactory
{
abstract public DPDocument CreateDocument();
abstract public DPView CreateView();
abstract public DPWorkspace CreateWorkspace();
}
abstract class DPApplication
{
protected DPDocument doc;
protected DPWorkspace workspace;
protected DPView view;
public void ConstructObjects(DPFactory factory)
{
// Create objects as needed
doc = factory.CreateDocument();
workspace = factory.CreateWorkspace();
view = factory.CreateView();
}
abstract public void Dump();
public void DumpState()
{
if (doc != null) doc.Dump();
if (workspace != null) workspace.Dump();
if (view != null) view.Dump();
}
}
// These classes could be part of an application
class MyApplication : DPApplication
{
MyFactory myFactory = new MyFactory();
override public void Dump()
{
Console.WriteLine("MyApplication exists");
}
public void CreateFamily()
{
MyFactory myFactory = new MyFactory();
ConstructObjects(myFactory);
}
}
class MyDocument : DPDocument
{
public MyDocument()
{
Console.WriteLine("in MyDocument constructor");
}
override public void Dump()
{
Console.WriteLine("MyDocument exists");
}
}
class MyWorkspace : DPWorkspace
{
override public void Dump()
{
Console.WriteLine("MyWorkspace exists");
}
}
class MyView : DPView
{
override public void Dump()
{
Console.WriteLine("MyView exists");
}
}
class MyFactory : DPFactory
{
override public DPDocument CreateDocument()
{
return new MyDocument();
}
override public DPWorkspace CreateWorkspace()
{
return new MyWorkspace();
}
override public DPView CreateView()
{
return new MyView();
}
}
///<summary>
/// Summary description for Client.
///</summary>
public class Client
{
public static int Main(string[] args)
{
MyApplication myApplication = new MyApplication();
myApplication.CreateFamily();
myApplication.DumpState();
return 0;
}
}
}
Code in SOME:
ADPDocument
a_Dump()
ADPWorkspace
a_Dump()
ADPView
a_Dump()
CMyDocument :ADPDocument
()
o_Dump()
CMyWorkspace :ADPWorkspace
o_Dump()
CMyView : ADPView
o_Dump()
ADPFactory
ADPDocument a_CreateDocument()
ADPWorkspace a_CreateWorkspace()
ADPView a_CreateView()
CMyFactory :ADPFactory
ADPDocument o_CreateDocument()
ADPWorkspace o_CreateWorkspace()
ADPView o_CreateView()
ADPApplication ->ADPDocument[m_doc],->ADPWorkspace[m_workspace],->ADPView[m_view] //referrence list, be deviden by comma
ConstructObjects(ADPFactory)
a_Dump()
DumpState()
CMyApplication :ADPApplication, ->CMyFactory[_myFactory.()] //ref list and inherit list, ".()" means it will be created in defination
o_Dump()
CreateFamily()
CClient
main
CClient.main
{
CMyApplication myApplication.();
myApplication.CreateFamily()
{
CMyFactory myFactory.();
ConstructObjects<ADPApplication>(myFactory) //if this method belongs to one of its ancestors, should use "<AncestorName>"
{
m_doc = myFactory.CreateDocument<CMyFactory>()
{
CMyDocument.();
};
m_workspace = myFactory.CreateWorkspace<CMyFactory>()
{
CMyWorkspace.();
};
m_view = myFactory.CreateView<CMyFactory>()
{
CMyView.();
};
};
};
myApplication.DumpState()
{
m_doc.Dump();
m_workspace.Dump();
m_view.Dump();
};
}