模式設計c#--創(chuàng)建型--AbstractFactory
| 名稱 | Abstract Factory |
| 結(jié)構 |
|
| 意圖 | 提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。 |
| 適用性 |
|
Code Example
???????
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;
????????}
????}
}
//?Abstract?Factory?pattern?--?Structural?example??

using?System;
namespace?DoFactory.GangOfFour.Abstract.Structural

{
??//?MainApp?test?application?
??class?MainApp
??
{
????public?static?void?Main()
????
{
??????//?Abstract?factory?#1?
??????AbstractFactory?factory1?=?new?ConcreteFactory1();
??????Client?c1?=?new?Client(factory1);
??????c1.Run();
??????//?Abstract?factory?#2?
??????AbstractFactory?factory2?=?new?ConcreteFactory2();
??????Client?c2?=?new?Client(factory2);
??????c2.Run();
??????//?Wait?for?user?input?
??????Console.Read();
????}
??}
??//?"AbstractFactory"?
??abstract?class?AbstractFactory
??
{
????public?abstract?AbstractProductA?CreateProductA();
????public?abstract?AbstractProductB?CreateProductB();
??}
??//?"ConcreteFactory1"?
??class?ConcreteFactory1?:?AbstractFactory
??
{
????public?override?AbstractProductA?CreateProductA()
????
{
??????return?new?ProductA1();
????}
????public?override?AbstractProductB?CreateProductB()
????
{
??????return?new?ProductB1();
????}
??}
??//?"ConcreteFactory2"?
??class?ConcreteFactory2?:?AbstractFactory
??
{
????public?override?AbstractProductA?CreateProductA()
????
{
??????return?new?ProductA2();
????}
????public?override?AbstractProductB?CreateProductB()
????
{
??????return?new?ProductB2();
????}
??}
??//?"AbstractProductA"?
??abstract?class?AbstractProductA
??
{
??}
??//?"AbstractProductB"?
??abstract?class?AbstractProductB
??
{
????public?abstract?void?Interact(AbstractProductA?a);
??}
??//?"ProductA1"?
??class?ProductA1?:?AbstractProductA
??
{
??}
??//?"ProductB1"?
??class?ProductB1?:?AbstractProductB
??
{
????public?override?void?Interact(AbstractProductA?a)
????
{
??????Console.WriteLine(this.GetType().Name?+?
????????"?interacts?with?"?+?a.GetType().Name);
????}
??}
??//?"ProductA2"?
??class?ProductA2?:?AbstractProductA
??
{
??}
??//?"ProductB2"?
??class?ProductB2?:?AbstractProductB
??
{
????public?override?void?Interact(AbstractProductA?a)
????
{
??????Console.WriteLine(this.GetType().Name?+?
????????"?interacts?with?"?+?a.GetType().Name);
????}
??}
??//?"Client"?-?the?interaction?environment?of?the?products?
??class?Client
??
{
????private?AbstractProductA?AbstractProductA;
????private?AbstractProductB?AbstractProductB;
????//?Constructor?
????public?Client(AbstractFactory?factory)
????
{
??????AbstractProductB?=?factory.CreateProductB();
??????AbstractProductA?=?factory.CreateProductA();
????}
????public?void?Run()
????
{
??????AbstractProductB.Interact(AbstractProductA);
????}
??}
}
?
ProductB1 interacts with ProductA1 ProductB2 interacts with ProductA2 |
posted on 2006-01-03 14:43 夢在天涯 閱讀(1065) 評論(3) 編輯 收藏 引用 所屬分類: Design pattern

