【序】先用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
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
}
在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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
44
override protected void OnInit(EventArgs e)
45
{
46
//
47
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
48
//
49
InitializeComponent();
50
base.OnInit(e);
51
}
52
53
/**//// <summary>
54
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
55
/// 此方法的内容。
56
/// </summary>
57
private void InitializeComponent()
58
{
59
this.Load += new System.EventHandler(this.Page_Load);
60
61
}
62
#endregion
63
}
64
}
65