学习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
}
using System;2
using System.Configuration;3
using System.Reflection;4
namespace ClassLibrary_AX5
{6

7

8
/// <summary>9
/// 基本工资10
/// </summary>11
public class Constant12
{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 ITax23
{24
//计算缴税金额的抽象方法25
public abstract double CalculateTax();26
}27

28

29

30
/// <summary>31
/// IBouns 奖金接口32
/// </summary>33
public abstract class IBonus34
{35
//计算工资奖金抽象方法36
public abstract double CalculateBonus();37
}38

39

40

41
/// <summary>42
/// 计算在中国应缴多少税:实现ITax接口43
/// </summary>44
public class ChineseTax : ITax45
{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 : IBonus58
{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 : ITax71
{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 : IBonus84
{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 AbstractFactory97
{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:AbstractFactory114
{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 : AbstractFactory132
{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
}在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![]()
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 AX14
{15
/// <summary>16
/// WebForm1 的摘要说明。17
/// </summary>18
public class WebForm1 : System.Web.UI.Page19
{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

少帮主的斧头好久不饮血了!


浙公网安备 33010602011771号