软件工程 - 设计模式学习之工厂方法模式Factory Method
在現實生活中我們可以看見,樂事在賣薯片,可比克也在賣.
我敢肯定的說它們各自都有自己的工廠來生產薯片,而且生產出來的薯片味道還是不一樣的.
這就是我們這里所謂的工廠方法模式. 我們來看看這個模式的UML圖:
?
這個模式中我們可以看到:
產品和工廠2個基類,然后它們下面又有些子孫類.
--------------------------------------------------------------------------------
現在進入我們的代碼環節了,首先上場的是PHP.?
?2?abstract?class?Product{???
?3?????abstract?function?Test();???
?4?}???
?5???
?6?class?leshi?extends?Product?{???
?7?????public?function?Test()?{???
?8?????????echo("Leshi!\n");???
?9?????}???
10?}???
11?class?kebike?extends?Product?{???
12?????public?function?Test()?{???
13?????????echo("Kebike!\n");???
14?????}???
15?}???
16?//抽象工廠???
17?abstract?class?Factory{???
18?????abstract?function?GetProduct();???
19?}???
20???
21?class?leshiFactory?extends?Factory{?????
22?????public?function?GetProduct()?{???
23?????????return?new?leshi();???
24?????}???
25?}???
26?class?kebikeFactory?extends??Factory{???
27?????public?function?GetProduct()?{???
28?????????return?new?kebike();???
29?????}???
30?}???
31?//首先我們先建立兩個公司的工廠.???
32?$leshiF?=?new?leshiFactory();???
33?$kebikeF?=?new?kebikeFactory();???
34?//每個工廠給我出10包薯片???
35?for($i=0;$i<10;$i++){???
36?????$leshiF->GetProduct()->Test();???
37?????$kebikeF->GetProduct()->Test();???
38?}??
39?
40?//抽象產品
41?abstract?class?Product{
42?????abstract?function?Test();
43?}
44?
45?class?leshi?extends?Product?{
46?????public?function?Test()?{
47?????????echo("Leshi!\n");
48?????}
49?}
50?class?kebike?extends?Product?{
51?????public?function?Test()?{
52?????????echo("Kebike!\n");
53?????}
54?}
55?//抽象工廠
56?abstract?class?Factory{
57?????abstract?function?GetProduct();
58?}
59?
60?class?leshiFactory?extends?Factory{??
61?????public?function?GetProduct()?{
62?????????return?new?leshi();
63?????}
64?}
65?class?kebikeFactory?extends??Factory{
66?????public?function?GetProduct()?{
67?????????return?new?kebike();
68?????}
69?}
70?//首先我們先建立兩個公司的工廠.
71?$leshiF?=?new?leshiFactory();
72?$kebikeF?=?new?kebikeFactory();
73?//每個工廠給我出10包薯片
74?for($i=0;$i<10;$i++){
75?????$leshiF->GetProduct()->Test();
76?????$kebikeF->GetProduct()->Test();
77?}
78?
79?
?
和簡單工廠模式有點兒像,但是那個只有一個工廠實例,
而我們這里是有多少種產品就有多少個工廠實例
--------------------------------------------------------------------------------
?C#粉墨登場:
{???
????using?System;???
??
????//?These?two?classes?could?be?part?of?a?framework,???
????//?which?we?will?call?DP???
????//?===============================================???
???????
????class?DPDocument????
????{???
???????
??
????}???
??
????abstract?class?DPApplication????
????{???
????????protected?DPDocument?doc;???
???????????
????????abstract?public?void?CreateDocument();???
??
????????public?void?ConstructObjects()???
????????{???
???????????????
????????????//?Create?objects?as?needed???
????????????//?.?.?.???
??
????????????//?including?document???
????????????CreateDocument();???
????????}??????????
????????abstract?public?void?Dump();???
????}???
??
????//?These?two?classes?could?be?part?of?an?application????
????//?=================================================???
??
????class?MyApplication?:?DPApplication????
????{???
????????override?public?void?CreateDocument()???
????????{???
????????????doc?=?new?MyDocument();????????????
????????}??????????????
??
????????override?public?void?Dump()???
????????{???
????????????Console.WriteLine("MyApplication?exists");???
????????}???
????}??????
??
????class?MyDocument?:?DPDocument????
????{???
??
????}???
??
????///?<SUMMARY></SUMMARY>???
????///????Summary?description?for?Client.???
????///????
????public?class?Client???
????{???
????????public?static?int?Main(string[]?args)???
????????{???
????????????MyApplication?myApplication?=?new?MyApplication();???
??
????????????myApplication.ConstructObjects();???
??
????????????myApplication.Dump();???
???????????????
????????????return?0;???
????????}???
????}???
}??
namespace?FactoryMethod_DesignPattern
{
????using?System;
?//?These?two?classes?could?be?part?of?a?framework,
?//?which?we?will?call?DP
?//?===============================================
?
?class?DPDocument?
?{
?
?}
?abstract?class?DPApplication?
?{
??protected?DPDocument?doc;
??
??abstract?public?void?CreateDocument();
??public?void?ConstructObjects()
??{
???
???//?Create?objects?as?needed
???//?.?.?.
???//?including?document
???CreateDocument();
??}??
??abstract?public?void?Dump();
?}
?//?These?two?classes?could?be?part?of?an?application?
?//?=================================================
?class?MyApplication?:?DPApplication?
?{
??override?public?void?CreateDocument()
??{
???doc?=?new?MyDocument();???
??}???
??override?public?void?Dump()
??{
???Console.WriteLine("MyApplication?exists");
??}
?}?
?class?MyDocument?:?DPDocument?
?{
?}
????///?
????///????Summary?description?for?Client.
????///?
????public?class?Client
????{
????????public?static?int?Main(string[]?args)
????????{
????????????MyApplication?myApplication?=?new?MyApplication();
???myApplication.ConstructObjects();
???myApplication.Dump();
???
????????????return?0;
????????}
????}
}
?
--------------------------------------------------------------------------------
Delphi王者駕臨!
?
Delphi IProduct?=?interface?????procedure?Test;?
??end;?
??IFactory?=?interface?
????function?GetProduct:IProduct;?
??end;?
??TLeShi?=?class(TInterfacedObject,IProduct)?
??public?
????procedure?Test;?
??end;?
??TKeBiKe?=?class(TInterfacedObject,IProduct)?
??public?
????procedure?Test;?
??end;?
??TLeShiFactory?=?class(TInterfacedObject,IFactory)?
??public?
????function?GetProduct:IProduct;?
??end;?
??TKeBiKeFactory?=?class(TInterfacedObject,IFactory)?
??public?
????function?GetProduct:IProduct;?
??end;?
var?
??Form1:?TForm1;?
implementation?
{$R?*.dfm}?
{?TKeBiKeFactory?}?
function?TKeBiKeFactory.GetProduct:?IProduct;?
begin?
??Result:=TKeBiKe.Create;?
end;?
{?TLeShi?}?
procedure?TLeShi.Test;?
begin?
??ShowMessage('LeShi!');?
end;?
{?TKeBiKe?}?
procedure?TKeBiKe.Test;?
begin?
??ShowMessage('KeBiKe');?
end;?
{?TLeShiFactory?}?
function?TLeShiFactory.GetProduct:?IProduct;?
begin?
??Result:=TLeShi.Create;?
end;?
?
--------------------------------------------------------------------------------
給樂事和可比克打了廣告不知道能不能得到點兒廣告費喲..哈哈.
我們最后看看這個模式的適用性:
當一個類不知道它所必須創建的對象的類的時候。
當一個類希望由它的子類來指定它所創建的對象的時候。
當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
轉載于:https://www.cnblogs.com/huangjacky/archive/2009/12/07/1618918.html
總結
以上是生活随笔為你收集整理的软件工程 - 设计模式学习之工厂方法模式Factory Method的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: biztalk BLogs
- 下一篇: asp.net ajax控件工具集 Au