.NET设计模式学习(抽象工厂模式)学习笔记

最近想学习设计模式方面的知识,在园子里搜索了一下,最后选定了TerryLee的博文作为参考。感谢园子里的高人能够把知识一同分享。

下面是我在学习中遇到的感觉比较难以理解的地方做的一些笔记,欢迎大家前来指正。本人正在学习中,非常希望能有高人指点,以防误入歧途,呵呵。

 

  我今天研究的是抽象工厂模式。(原文地址:http://www.cnblogs.com/terrylee/archive/2005/12/13/295965.html)

 在这篇文章中,我遇到的问题是最后利用反射机制建立抽象工厂类这部分。

把原文中提供的代码Down下以后发现里面有一些小问题,虽然问题不是很大,但是对于我一个初学者来说一时摸不着头脑。捣鼓了一上午终于能够顺利完成想要的功能了。下面是针对此问题的详解。

 

关于反射机制的定义及原理这里不再阐述,有兴趣的朋友可以上网查询。这里主要介绍文中反射机制的用法及参数含义:

 

 Assembly.Load("程序集名称").CreateInstance("命名空间.类");

 

 “程序集名称”是类库生成的DLL文件的名称。

 

先看一下我修改后的示例代码:

 

 一、建立控制台应用程序AbstractFactoryTest

 

1、首先建立抽象工厂类AbstractFactory.cs
    namespace AbstractFactoryTest
{
    public abstract class AbstractFactory
    {
        public static AbstractFactory GetInstance()
        {
            string factoryAssemblyName = Constant.AssemblyName.ToString();
            string factoryClassName = Constant.ClassName.ToString();


            AbstractFactory instance;

            if (!String.IsNullOrEmpty(factoryClassName) && !String.IsNullOrEmpty(factoryAssemblyName))
            {
                instance = (AbstractFactory)Assembly.Load(factoryAssemblyName).CreateInstance(factoryClassName);
            }
            else
                instance = null;

            return instance;
        }


        public abstract Tax CreateTax();

        public abstract Bonus CreateBonus();
    }

    /// <summary>
    /// 奖金抽象类
    /// </summary>
    public abstract class Bonus
    {
        public abstract double Calculate();
    }

    /// <summary>
    /// 个人所得税抽象类
    /// </summary>
    public abstract class Tax
    {
        public abstract double Calculate();
    }

    /// <summary>
    /// 公用的常量
    /// </summary>
    public class Constant
    {
        public static double BASE_SALARY = 4000;
        public static string AssemblyName = ConfigurationSettings.AppSettings["AssemblyName"];
        public static string ClassName = ConfigurationSettings.AppSettings["ClassName"];
    }
}

 2、修改主函数类Program.cs

    /// <summary>
    /// 客户端程序调用
    /// </summary>
    public class Program
    {
        public static void Main(string[] args)
        {
            AbstractFactory abstractfactory = AbstractFactory.GetInstance();
            if (abstractfactory != null)
            {

                Bonus bonus = abstractfactory.CreateBonus();
                double bonusValue = bonus.Calculate();

                Tax tax = abstractfactory.CreateTax();
                double taxValue = tax.Calculate();

                double salary = 4000 + bonusValue - taxValue;

                Console.WriteLine("Salary is:" + salary);
                Console.ReadLine();
            }
        }
    } 

3、配置文件App.config为:

  <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="AssemblyName" value="ChineseSalaryTest"/>
        <add key="ClassName" value="ChineseSalary.ChineseFactory"/>
      </appSettings>
    </configuration>

 

 

二、 建立各国的薪水类库,以中国为例,取名ChineseSalaryTest

       注意添加引用AbstractFactoryTest

 

      1、建立工厂类ChineseFactory.cs

namespace ChineseSalary(注意此处命名空间名称已修改)

   /// <summary>
    /// ChineseFactory类
    /// </summary>
    public class ChineseFactory: AbstractFactory
    {
        public override Tax CreateTax()
        {
            return new ChineseTax();
        }

        public override Bonus CreateBonus()
        {
            return new ChineseBonus();
        }
    }
    /// <summary>
    /// 计算中国个人所得税
    /// </summary>
    public class ChineseTax : Tax
    {
        public override double Calculate()
        {
            return (Constant.BASE_SALARY + (Constant.BASE_SALARY * 0.2)) * 0.25;
        }
    }
    /// <summary>
    /// 计算中国奖金
    /// </summary>
    public class ChineseBonus : Bonus
    {
        public override double Calculate()
        {
            return Constant.BASE_SALARY * 0.2;
        }
    }

}

 

本示例全部代码已完成 ,首先将类库ChineseSalaryTest生成的dll文件拷贝到AbstractFactoryTest类库的bin/Debug目录下

然后 配置AbstractFactoryTest类库中config文件

配置正确以后运行即可看到结果。

 

总结:我的想法是在以后需要修改为其他国家薪水制度时,只需要编写与ChineseSalaryTest类似的类库,然后将生成的DLL文件拷贝到主程序中,然后修改配置文件即可。

 

 

 

 

转载于:https://www.cnblogs.com/zxh0208/archive/2010/08/06/1794164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值