最近想学习设计模式方面的知识,在园子里搜索了一下,最后选定了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文件拷贝到主程序中,然后修改配置文件即可。