• .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文件拷贝到主程序中,然后修改配置文件即可。

  • 相关阅读:
    最详细易懂的CRC-16校验原理(附源程序)
    咳嗽秘方
    三十年前三十年后
    车载导航系统中常用物理量和单位
    mssql 中文乱码 字库集 问题解决方法
    CuteEditor.Editor+a+a+c+a+a.a() System.RuntimeType.get_Assembly() 问题解决方法
    .NET Framework 4.5 五个很棒的特性
    很管用的治咳嗽秘方
    python 使用pip install 手动安装本地包的方法
    Facebook支持python的开源预测工具Prophet
  • 原文地址:https://www.cnblogs.com/zxh0208/p/1794164.html
Copyright © 2020-2023  润新知