先举一个问题.来说明一下. 假如我要发RMB给中国员工,中国员工工资是1000元, 美国员工的工资是5000$,但是需要转换成为RMB就是6.8, 想用抽象工厂模式来实现发工资这个功能.
1. 确定工资Bouns 我们要确定一个方法,来计算工资的.这个Class我们叫做Bouns里面有一个方法Calculate()是计算工资.
- namespace AbstractFactory
- {
- public abstract class Bouns
- {
- public abstract double Calculate();
- }
- }
2. 然后我们声明再来建立两个员工,一个是中国员工,另一个是美国员工.
- namespace AbstractFactory
- {
- public class ChineseBouns:Bouns
- {
- public override double Calculate()
- {
- return 1000;
- }
- }
- }
- namespace AbstractFactory
- {
- public class AmericaBouns:Bouns
- {
- public override double Calculate()
- {
- return 5000*6.8;
- }
- }
- }
3. 在普通工厂模式中,如果我们需要调用的话.只需要建立一个工厂,或者说是一个中间类.来实现这个功能.这就是工厂,一个用于处理业务的方法.
- public class CommonFactory
- {
- public Bouns CreateBouns()
- {
- return new ChineseBouns();
- }
- }
- CommonFactory factory = new CommonFactory();
- double salary = Factory.CreateBouns().Calculate();
但是问题在于,如果你要给美国员工开工资,你就要修改你的CommonFactory
4. 在抽像工厂模式中,这个问题被解决了.
首先建立两个工厂,分别用于处理中国员工工资和美国员工工资的.
- namespace AbstractFactory
- {
- public class AmericanFactory:AbstractFactory
- {
- public override Bouns CreateBonus()
- {
- return new AmericaBouns();
- }
- }
- }
- namespace AbstractFactory
- {
- public class ChineseFactory:AbstractFactory
- {
- public override Bouns CreateBonus()
- {
- return new ChineseBouns();
- }
- }
- }
接下来,我们要利用这个工厂.于是我们建立一个抽像的工厂,所谓抽象是相对于中国工厂和美国工厂的抽象,他对于调用而言他只要工厂,不分中国还是美国.
- namespace AbstractFactory
- {
- public abstract class AbstractFactory
- {
- public static AbstractFactory GetInstance(string countyName)
- {
- AbstractFactory instance;
- if (countyName.Equals("China"))
- instance = new ChineseFactory();
- else if (countyName.Equals("American"))
- instance = new AmericanFactory();
- else
- instance = null;
- return instance;
- }
- public abstract Bouns CreateBonus();
- }
- }
- 前端使用的时候
- AbstractFactory factory = AbstractFactory.GetInstance("American");
- double money = factory.CreateBonus().Calculate();
只要将参数传递进去,就可以根据参数来判断需要开的工资类型.当然这个参数可以写到配置文件里面,在AbstractFactory的GetInstance事件里面可以通过读取配置文件来实现不同员工工资的读取.
当然例子可以举的不太恰当, 只是处于一个简单理解的角度出发的,如果你把工资换成别的,比如说不同国家人的有不同的工资计算方法,很复杂. 或者是用于其它一些其它业务.
参考了博客园内的一篇文章:http://www.cnblogs.com/Terrylee/archive/2005/12/13/295965.html