作者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://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1452951892.A.38A.html
1F:→ Litfal: 1. LOG的话我会用.config去设定 01/16 21:54
2F:→ Litfal: 2. 有interface,call method应该就不用反射,抽象也是, 01/16 21:55
3F:→ Litfal: 反射应该是用来实现IoC,让工厂建立并回传适合的instance 01/16 21:57
4F:→ Litfal: 我这边mega怪怪的专案还拉不下来,所以先以你的描述来回答 01/16 21:58
附上图片了,再麻烦各位前辈指点...
※ 编辑: KSmart (114.39.104.214), 01/18/2016 00:05:47
5F:推 YahooTaiwan: 1. Logger 实作 Singleton 01/18 05:50
6F:推 YahooTaiwan: 2. 看不懂问题 01/18 05:52
7F:→ YahooTaiwan: 3. 没看到哪边有四层式架构,但此架构没问题 01/18 05:53
8F:推 Litfal: 所谓的工厂,是用来建立物件(instance)的,不是用来call某 01/18 10:19
9F:→ Litfal: method的喔。(FactoryLib第一张图) 01/18 10:20
10F:→ Litfal: 工厂建立出来的物件都要符合某一种规范,那规范就是介面或 01/18 10:21
11F:→ Litfal: 抽象类(其实不局限於抽象类啦),并且在建立後回传该介面 01/18 10:22
12F:→ Litfal: 以你的例子,就是要回传ProcessProvide。 01/18 10:22
13F:→ Litfal: 呼叫端(Form)只相依於工厂与规范(ProcessProvide),而不须 01/18 10:33
14F:→ Litfal: 知道实作类(ProcessOfTainan及ProcessOfTaipei)的存在,以 01/18 10:34
15F:→ Litfal: 解除与众多实作类的相依性 01/18 10:34
16F:→ Litfal: 呼叫端只需使用工厂建立instance,再依规范呼叫方法即可 01/18 10:39
17F:→ Litfal: 简单的code会像这种感觉: 01/18 10:39
18F:→ Litfal: ProcessProvide provider = factory.Create(arg); 01/18 10:40
19F:→ Litfal: provider.CalcAB(...); 01/18 10:41