作者KSmart (經濟不景氣,好景不常在)
看板C_Sharp
標題[問題] 抽象工廠方法請益...麻煩高手解答
時間Sat Jan 16 21:44:47 2016
最近看到一系列的工廠方法...想說直接以實作來了解。
但是,一些問題不是很清楚,周遭的朋友開發也沒管啥開發方式..
所以,轉而向網路上各位前輩指教,希望各位前輩指點一二。
我自己寫了一小段SampleCode,希望直接透過Code詢問會比較清楚@@
https://mega.nz/#!OIBElJ6a!_Mn1NldD2V-ZjosPEIRpcFEjW5QKZtzYNggyzu-PJBQ
主要的系統分為三塊,如圖:
http://i.imgur.com/SyOOpsp.png
1.Form
http://i.imgur.com/2GL7wkv.jpg
2.FactoryLib
http://i.imgur.com/WWPglb6.jpg
http://i.imgur.com/WYsyfqN.jpg
http://i.imgur.com/YNKL6WW.jpg
http://i.imgur.com/HYtzYtw.jpg
3.Log
1.最主要的Form,也是最單純的部分,只給User Keyin數值。所以,也就不引用Log.dll
2.將所有流程及處理作業都寫在此部分,因此FactoryLib會記錄Log,故引用Log.dll
3.當然就是自己寫的Log.dll 了(內容會是自己寫Log的方式...)
FactoryLib內有四個.cs
最上層為 ProcessFactory => 負責判斷需要呼叫哪個模組..
下一層為 ProcessProvide => 此為抽象Class
ProcessOfTainan => 繼承ProcessProvide 實作變數A*B
ProcessOfTaipei => 繼承ProcessProvide 實作變數A+B
問題一:
因為實際在處理作業流程的Class應該是 ProcessOfTainan 及 ProcessOfTaipei
所以,會在此New log 這個物件..
但是,Log所需要紀錄的位置,會從Form1傳入,請問我要怎麼寫會比較好??
問題二:
我有看過相關文章,如果使用Interface
可以透過反射,直接傳入Function Name,就可以呼叫該Function。
那如果使用抽象的方式呢?
問題三:
這樣的架構是否正確呢?
對於這種四層式(含Form)的方式不是很清楚,希望各位前輩指點@@
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.239.187.103
※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1452951892.A.38A.html
→ Litfal: 1. LOG的話我會用.config去設定 01/16 21:54
→ Litfal: 2. 有interface,call method應該就不用反射,抽象也是, 01/16 21:55
→ Litfal: 反射應該是用來實現IoC,讓工廠建立並回傳適合的instance 01/16 21:57
→ Litfal: 我這邊mega怪怪的專案還拉不下來,所以先以你的描述來回答 01/16 21:58
附上圖片了,再麻煩各位前輩指點...
※ 編輯: KSmart (114.39.104.214), 01/18/2016 00:05:47
推 YahooTaiwan: 1. Logger 實作 Singleton 01/18 05:50
推 YahooTaiwan: 2. 看不懂問題 01/18 05:52
→ YahooTaiwan: 3. 沒看到哪邊有四層式架構,但此架構沒問題 01/18 05:53
推 Litfal: 所謂的工廠,是用來建立物件(instance)的,不是用來call某 01/18 10:19
→ Litfal: method的喔。(FactoryLib第一張圖) 01/18 10:20
→ Litfal: 工廠建立出來的物件都要符合某一種規範,那規範就是介面或 01/18 10:21
→ Litfal: 抽象類(其實不侷限於抽象類啦),並且在建立後回傳該介面 01/18 10:22
→ Litfal: 以你的例子,就是要回傳ProcessProvide。 01/18 10:22
→ Litfal: 呼叫端(Form)只相依於工廠與規範(ProcessProvide),而不須 01/18 10:33
→ Litfal: 知道實作類(ProcessOfTainan及ProcessOfTaipei)的存在,以 01/18 10:34
→ Litfal: 解除與眾多實作類的相依性 01/18 10:34
→ Litfal: 呼叫端只需使用工廠建立instance,再依規範呼叫方法即可 01/18 10:39
→ Litfal: 簡單的code會像這種感覺: 01/18 10:39
→ Litfal: ProcessProvide provider = factory.Create(arg); 01/18 10:40
→ Litfal: provider.CalcAB(...); 01/18 10:41