工厂模式与抽象工厂模式

先举一个问题.来说明一下. 假如我要发RMB给中国员工,中国员工工资是1000元, 美国员工的工资是5000$,但是需要转换成为RMB就是6.8, 想用抽象工厂模式来实现发工资这个功能.
1.    确定工资Bouns 我们要确定一个方法,来计算工资的.这个Class我们叫做Bouns里面有一个方法Calculate()是计算工资.
  1. namespace AbstractFactory
  2. {
  3.     public abstract class Bouns
  4.     {
  5.         public abstract double Calculate();
  6.     }
  7. }

2.    然后我们声明再来建立两个员工,一个是中国员工,另一个是美国员工.
  1. namespace AbstractFactory
  2. {
  3.     public class ChineseBouns:Bouns
  4.     {
  5.         public override double Calculate()
  6.         {
  7.             return 1000;
  8.         }
  9.     }
  10. }
  11. //这个是美国的员工工资
  12. namespace AbstractFactory
  13. {
  14.    public class AmericaBouns:Bouns
  15.    {
  16.      public override double Calculate()
  17.        {
  18.             return 5000*6.8;
  19.         }
  20.     }
  21. }

3.    在普通工厂模式中,如果我们需要调用的话.只需要建立一个工厂,或者说是一个中间类.来实现这个功能.这就是工厂,一个用于处理业务的方法.
  1. public class CommonFactory
  2. {
  3.     public Bouns CreateBouns()
  4. {
  5.     return new ChineseBouns();
  6. }
  7. }
  8. //前端代码可以直接
  9. CommonFactory factory = new CommonFactory();
  10. double salary = Factory.CreateBouns().Calculate();
但是问题在于,如果你要给美国员工开工资,你就要修改你的CommonFactory

4.    在抽像工厂模式中,这个问题被解决了.
首先建立两个工厂,分别用于处理中国员工工资和美国员工工资的.
  1. namespace AbstractFactory
  2. {
  3.     public class AmericanFactory:AbstractFactory
  4.     {
  5.         public override Bouns CreateBonus()
  6.         {
  7.             return new AmericaBouns();
  8.         }
  9.     }
  10. }
  11. //针对中国员工的计算方法,用来计算中国员工的工资.
  12. namespace AbstractFactory
  13. {
  14.     public class ChineseFactory:AbstractFactory
  15.     {
  16.         public override Bouns CreateBonus()
  17.         {
  18.             return new ChineseBouns();
  19.         }
  20.     }
  21. }

接下来,我们要利用这个工厂.于是我们建立一个抽像的工厂,所谓抽象是相对于中国工厂和美国工厂的抽象,他对于调用而言他只要工厂,不分中国还是美国.
  1. namespace AbstractFactory
  2. {
  3.     public abstract class AbstractFactory
  4.     {
  5.         public static AbstractFactory GetInstance(string countyName)
  6.         {
  7.             AbstractFactory instance;
  8.             if (countyName.Equals("China"))
  9.                 instance = new ChineseFactory();
  10.             else if (countyName.Equals("American"))
  11.                 instance = new AmericanFactory();
  12.             else
  13.                 instance = null;
  14.             return instance;
  15.         }
  16.         public abstract Bouns CreateBonus();
  17.     }
  18. }
  19. 前端使用的时候
  20. AbstractFactory factory = AbstractFactory.GetInstance("American");
  21. double money = factory.CreateBonus().Calculate();
只要将参数传递进去,就可以根据参数来判断需要开的工资类型.当然这个参数可以写到配置文件里面,在AbstractFactory的GetInstance事件里面可以通过读取配置文件来实现不同员工工资的读取.

当然例子可以举的不太恰当, 只是处于一个简单理解的角度出发的,如果你把工资换成别的,比如说不同国家人的有不同的工资计算方法,很复杂.  或者是用于其它一些其它业务.

参考了博客园内的一篇文章:http://www.cnblogs.com/Terrylee/archive/2005/12/13/295965.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值