学习TerryLee 的设计模式:抽象工厂模式(附源码)_AX
【序】先用VS2005做,失败!又Copy到VS2003,经调试n次后成功,历时二天!
该模式的详细讲解参见(有我好多留言哈,看文章也要看回复):
http://terrylee.cnblogs.com/archive/2005/12/13/295965.html?Pending=true#Post
【总结】
这个模式涉及到的东西好多啊!
①把子类当父类用
昨天发现本好书<<C# Primary plus 中文>> 一晚上就OK了.
②反射(Reflection)
通过Assembly来实现动态生成对象,还可以获得类型的信息什么的.
③程序集相关知识
就是Assembly了,这个得单独讲.
④整个过程的脉络我还是没搞太清楚,太神奇了!
基本上就是先建抽象工厂,再建工厂,有工厂了就可以造东西了.
⑤严重测出了我C#的知识不牢固:
有待我测试,敬请指点:
Ⅰ.只有abstract方法可以用override吗?我记得一般的方法也可以重写
intertface abstract virtrul 可以用override 它们是子类父类关系(个人理解因为abstract可以隐式转换为virtrul(把其函数体去掉)) 一般方法不能重写,默认属性为非virturl,就是为了防止重写.
Ⅱ.new也可以重写方法,只能子类用,right?有点自信
right,不过用new叫覆盖.
参见:http://blog.csdn.net/gangyaocn/archive/2006/04/23/673758.aspx
Ⅲ.Main方法必须用static吗?必须有参数吗?
必须用,Main()是程序的入口,必须用public 和static修饰,有时候会看到没有static,即暗示我们:Main()方法默认为static方法,可以没有参数,其带的参数的使用方法,跟在命令行里敲命令时附带参数相同.具体应用没这方面的经验.好像很少用到.
【注意】类文件和调用文件没在一个命名空间下,所以在Web.config文件里的value值为: 命名空间.类名 搞了好久才搞出来的.要不是这个问题,估计一天就弄完了.
【一个维护性良好的系统应该遵循“开闭原则”。即:封闭对原来代码的修改,开放对原来代码的扩展】
【源码】创建了一个项目,包含该文件:AbstractFactory.cs
在Web.Config中添加下面这一节:
<appSettings>
<add key="factoryName" value="ClassLibrary_AX.ChineseFactory"></add>
</appSettings>
页面调用查看结果
该模式的详细讲解参见(有我好多留言哈,看文章也要看回复):
http://terrylee.cnblogs.com/archive/2005/12/13/295965.html?Pending=true#Post
【总结】
这个模式涉及到的东西好多啊!
①把子类当父类用
昨天发现本好书<<C# Primary plus 中文>> 一晚上就OK了.
②反射(Reflection)
通过Assembly来实现动态生成对象,还可以获得类型的信息什么的.
③程序集相关知识
就是Assembly了,这个得单独讲.
④整个过程的脉络我还是没搞太清楚,太神奇了!
基本上就是先建抽象工厂,再建工厂,有工厂了就可以造东西了.
⑤严重测出了我C#的知识不牢固:
有待我测试,敬请指点:
Ⅰ.只有abstract方法可以用override吗?我记得一般的方法也可以重写
intertface abstract virtrul 可以用override 它们是子类父类关系(个人理解因为abstract可以隐式转换为virtrul(把其函数体去掉)) 一般方法不能重写,默认属性为非virturl,就是为了防止重写.
Ⅱ.new也可以重写方法,只能子类用,right?有点自信
right,不过用new叫覆盖.
参见:http://blog.csdn.net/gangyaocn/archive/2006/04/23/673758.aspx
Ⅲ.Main方法必须用static吗?必须有参数吗?
必须用,Main()是程序的入口,必须用public 和static修饰,有时候会看到没有static,即暗示我们:Main()方法默认为static方法,可以没有参数,其带的参数的使用方法,跟在命令行里敲命令时附带参数相同.具体应用没这方面的经验.好像很少用到.
【注意】类文件和调用文件没在一个命名空间下,所以在Web.config文件里的value值为: 命名空间.类名 搞了好久才搞出来的.要不是这个问题,估计一天就弄完了.
【一个维护性良好的系统应该遵循“开闭原则”。即:封闭对原来代码的修改,开放对原来代码的扩展】
【源码】创建了一个项目,包含该文件:AbstractFactory.cs
1
using System;
2
using System.Configuration;
3
using System.Reflection;
4
namespace ClassLibrary_AX
5
{
6
7
8
/// <summary>
9
/// 基本工资
10
/// </summary>
11
public class Constant
12
{
13
public static double BaseSalary = 1500;
14
public static string factoryName = ConfigurationSettings.AppSettings["factoryName"];
15
}
16
17
18
19
/// <summary>
20
/// ITax 税接口
21
/// </summary>
22
public abstract class ITax
23
{
24
//计算缴税金额的抽象方法
25
public abstract double CalculateTax();
26
}
27
28
29
30
/// <summary>
31
/// IBouns 奖金接口
32
/// </summary>
33
public abstract class IBonus
34
{
35
//计算工资奖金抽象方法
36
public abstract double CalculateBonus();
37
}
38
39
40
41
/// <summary>
42
/// 计算在中国应缴多少税:实现ITax接口
43
/// </summary>
44
public class ChineseTax : ITax
45
{
46
public override double CalculateTax()
47
{
48
return (Constant.BaseSalary + Constant.BaseSalary * 0.1) * 0.4;
49
}
50
}
51
52
53
54
/// <summary>
55
/// 计算在中国应得多少奖金:实现IBonus接口
56
/// </summary>
57
public class ChineseBonus : IBonus
58
{
59
public override double CalculateBonus()
60
{
61
return Constant.BaseSalary * 0.15;
62
}
63
}
64
65
66
67
/// <summary>
68
/// 计算在美国应缴多少税:实现ITax接口
69
/// </summary>
70
public class AmericanTax : ITax
71
{
72
public override double CalculateTax()
73
{
74
return (Constant.BaseSalary*0.15 + Constant.BaseSalary * 0.15) * 0.25;
75
}
76
}
77
78
79
80
/// <summary>
81
/// 计算在美国应得多少奖金:实现IBonus接口
82
/// </summary>
83
public class AmericanBonus : IBonus
84
{
85
public override double CalculateBonus()
86
{
87
return Constant.BaseSalary * 0.15;
88
}
89
}
90
91
92
//--------------------------------------------到重点了-----------------------------------------
93
/// <summary>
94
/// 抽象工厂
95
/// </summary>
96
public abstract class AbstractFactory
97
{
98
public static AbstractFactory GetInstance()
99
{
100
string factoryName = Constant.factoryName;
101
AbstractFactory Instance = (AbstractFactory)Assembly.Load("ClassLibrary_AX").CreateInstance(factoryName);
102
return Instance;
103
}
104
public abstract ITax CreateTax();
105
public abstract IBonus CreateBonus();
106
}
107
108
109
110
/// <summary>
111
/// 中国工厂
112
/// </summary>
113
public class ChineseFactory:AbstractFactory
114
{
115
public override ITax CreateTax()
116
{
117
return new ChineseTax();
118
}
119
120
public override IBonus CreateBonus()
121
{
122
return new ChineseBonus();
123
}
124
}
125
126
127
128
/// <summary>
129
/// 美国工厂
130
/// </summary>
131
public class AmericanFactory : AbstractFactory
132
{
133
public override ITax CreateTax()
134
{
135
return new AmericanTax();
136
}
137
138
public override IBonus CreateBonus()
139
{
140
return new AmericanBonus();
141
}
142
}
143
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

在Web.Config中添加下面这一节:
<appSettings>
<add key="factoryName" value="ClassLibrary_AX.ChineseFactory"></add>
</appSettings>
页面调用查看结果
1
using System;
2
using System.Collections;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Web;
7
using System.Web.SessionState;
8
using System.Web.UI;
9
using System.Web.UI.WebControls;
10
using System.Web.UI.HtmlControls;
11
using ClassLibrary_AX;
12
using System.Reflection;
13
namespace AX
14
{
15
/// <summary>
16
/// WebForm1 的摘要说明。
17
/// </summary>
18
public class WebForm1 : System.Web.UI.Page
19
{
20
21
private void Page_Load(object sender, System.EventArgs e)
22
{
23
// 在此处放置用户代码以初始化页面
24
if(!this.IsPostBack)
25
{
26
//根据条件,AF可能是中国工厂的实例
27
AbstractFactory AF = AbstractFactory.GetInstance();
28
29
//它创建的奖金实例就为中国的奖金实例
30
IBonus bonus=AF.CreateBonus();
31
double bonusValue = bonus.CalculateBonus();
32
33
//它创建的税额实例就为中国的税额实例
34
ITax tax = AF.CreateTax();
35
double taxValue = tax.CalculateTax();
36
37
double salary = Constant.BaseSalary + bonusValue - taxValue;
38
Response.Write("Salary is:" + salary);
39
40
}
41
}
42
43
Web 窗体设计器生成的代码
63
}
64
}
65

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

63

64

65

少帮主的斧头好久不饮血了!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端