AXzhz

专注ASP.NET!
        写软件的都是小姐,用软件的都是大爷。真TMD说的正确!
                嫖妓不给钱,反说被强奸!___中国共享软件的无奈!
读小学的时候大学不要钱,读大学了小学不要钱。
没工作时国家有分福利房,工作了后全是高价房!!

                        此软件能有效的破解QQ密码。(注:破解QQ密码是违法行为,请不要将软件用于违法行为)
“安得广厦千万间,大庇天下寒士俱欢颜,风雨不动安如山。”1200多年前,诗人杜甫的理想,如今被一帮享受着电脑和互联网带来的快捷生活方式的受过高等教育的大孩子憧憬着。

导航

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



页面调用查看结果
 1using System;
 2using System.Collections;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Web;
 7using System.Web.SessionState;
 8using System.Web.UI;
 9using System.Web.UI.WebControls;
10using System.Web.UI.HtmlControls;
11using ClassLibrary_AX;
12using System.Reflection;
13namespace 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

posted on 2006-10-28 18:22  斧头帮少帮主  阅读(785)  评论(2编辑  收藏  举报

Google
 
站内搜索:        
园内搜索:
金山词霸: