工厂方法模式--实现计算器

举报
ksh1998 发表于 2021/12/26 01:22:03 2021/12/26
【摘要】 前言:工厂方法模式名字上和前面第一个模式差不多,那就是简单工厂。其实这个计算器的例子,在前面使用简单工厂实现了一遍了。这次只是和使用相同的例子和工厂方法模式进行对比。在实现工厂方法模式的过程中发现了这个模式的优缺点! 优点:是每一个类或者功能的独立性非常好。实现了可扩展,而不用修改其他的类。 缺点:每增加一个产品就需要增加一个产品工...

前言:工厂方法模式名字上和前面第一个模式差不多,那就是简单工厂。其实这个计算器的例子,在前面使用简单工厂实现了一遍了。这次只是和使用相同的例子和工厂方法模式进行对比。在实现工厂方法模式的过程中发现了这个模式的优缺点!

优点:是每一个类或者功能的独立性非常好。实现了可扩展,而不用修改其他的类。

缺点:每增加一个产品就需要增加一个产品工厂的类。

目录

类图:

代码:

      form窗体:

运算:

      类:

      运算类

     工厂方法:

结果:


类图:

代码:

      form窗体:


  
  1. //窗体通用声明
  2. Operation oper =new Operation();//实例化运算类
  3. double result = 0;//结果
  4. //给按钮赋值
  5. string NumberA = "";
  6. string NumberB = "";
  7. //区分AB的赋值标签,如果是fals就给A赋值。
  8. //否则给B赋值。
  9. bool flage = false;
  10. //数字按钮
  11. private void button1_Click(object sender, EventArgs e)
  12. {
  13. //判断赋值对象
  14. if (flage)
  15. {
  16. NumberB += 1;
  17. textBox1.Text = NumberB;
  18. }
  19. else
  20. {
  21. NumberA += 1;
  22. textBox1.Text = NumberA;
  23. }
  24. }
  25. //每一个数字按钮的代码,几乎一摸一样。除了代表的数字之外,
  26. //其他的代码完全一样。所以就以1这个数字按钮为例就可以了。在这就不一一列举了!

运算:

 


  
  1. private void button12_Click(object sender, EventArgs e)
  2. {
  3. flage = true;//更改赋值标签
  4. //判断是否计算
  5. IFactory operFactory = new AddFactory();//实例化加法工厂
  6. oper = operFactory.CreateOperation();//创建加法运算
  7. }

  
  1. private void button11_Click(object sender, EventArgs e)
  2. {
  3. flage = true;//更改赋值标签
  4. IFactory operFactory = new SubFactory();
  5. oper = operFactory.CreateOperation();
  6. }

  
  1. private void button14_Click(object sender, EventArgs e)
  2. {
  3. flage = true;//更改赋值标签
  4. IFactory opertFactory = new MulFactory();
  5. oper = opertFactory.CreateOperation();
  6. }

 


  
  1. private void button14_Click(object sender, EventArgs e)
  2. {
  3. flage = true;//更改赋值标签
  4. IFactory opertFactory = new MulFactory();
  5. oper = opertFactory.CreateOperation();
  6. }

 


  
  1. private void button10_Click(object sender, EventArgs e)
  2. {
  3. //通过属性,给A和B赋值。
  4. oper.NumberA = double.Parse(NumberA);
  5. oper.NumberB = double.Parse(NumberB);
  6. //计算结果
  7. result = oper.GetResult();
  8. //显示结果
  9. textBox1.Text = result.ToString();
  10. }

      类:

      运算类

      


  
  1. namespace 计算器
  2. {
  3. /// <summary>
  4. /// 运算类
  5. /// </summary>
  6. public class Operation
  7. {
  8. //两个数
  9. private double _numberA = 0;
  10. private double _numberB = 0;
  11. /// <summary>
  12. /// 第一个数
  13. /// </summary>
  14. public double NumberA
  15. {
  16. get { return _numberA; }
  17. set { _numberA = value; }
  18. }
  19. /// <summary>
  20. /// 第二个数
  21. /// </summary>
  22. public double NumberB
  23. {
  24. get { return _numberB; }
  25. set { _numberB = value; }
  26. }
  27. /// <summary>
  28. /// 计算方法
  29. /// </summary>
  30. /// <returns></returns>
  31. public virtual double GetResult()
  32. {
  33. double result = 0;
  34. return result;
  35. }
  36. }
  37. }

 


  
  1. namespace 计算器
  2. {
  3. /// <summary>
  4. /// 加法类
  5. /// </summary>
  6. public class OperationAdd:Operation
  7. {
  8. /// <summary>
  9. /// 加法
  10. /// </summary>
  11. /// <returns>计算结果</returns>
  12. public override double GetResult()
  13. {
  14. double result = 0;
  15. result = NumberA + NumberB;
  16. return result;//返回结果
  17. }//end Getresult
  18. }
  19. }

 


  
  1. namespace 计算器
  2. {
  3. /// <summary>
  4. /// 乘法类
  5. /// </summary>
  6. public class OperationMul:Operation
  7. {
  8. /// <summary>
  9. /// 乘法
  10. /// </summary>
  11. /// <returns>结果</returns>
  12. public override double GetResult()
  13. {
  14. double result = 0;
  15. result = NumberA * NumberB;
  16. return result;
  17. }//end GetResult
  18. }
  19. }

 


  
  1. namespace 计算器
  2. {
  3. public class OpertionDiv:Operation
  4. {
  5. public override double GetResult()
  6. {
  7. double result = 0;
  8. if (NumberB==0)
  9. {
  10. result = 0;
  11. }
  12. else
  13. {
  14. result = NumberA / NumberB;
  15. }//end if
  16. return result;
  17. }//end GetResult
  18. }
  19. }

 


  
  1. namespace 计算器
  2. {
  3. /// <summary>
  4. /// 减法
  5. /// </summary>
  6. public class OperationSub:Operation
  7. {
  8. public override double GetResult()
  9. {
  10. double result = 0;
  11. result = NumberA - NumberB;
  12. return result;
  13. }//end GetResult
  14. }
  15. }

     工厂方法:


  
  1. namespace 计算器
  2. {
  3. //工厂接口
  4. public interface IFactory
  5. {
  6. Operation CreateOperation();//创建具体运算
  7. }
  8. }

  
  1. namespace 计算器
  2. {
  3. public class SubFactory:IFactory
  4. {
  5. public Operation CreateOperation()
  6. {
  7. return new OperationSub();//减法
  8. }
  9. }
  10. }

 


  
  1. namespace 计算器
  2. {
  3. /// <summary>
  4. /// 加法工厂
  5. /// </summary>
  6. public class AddFactory:IFactory
  7. {
  8. /// <summary>
  9. /// 创建加法运算
  10. /// </summary>
  11. /// <returns></returns>
  12. public Operation CreateOperation()
  13. {
  14. return new OperationAdd();//实例化加法类
  15. }
  16. }
  17. }

  
  1. namespace 计算器
  2. {
  3. public class MulFactory:IFactory
  4. {
  5. public Operation CreateOperation()
  6. {
  7. return new OperationMul();//乘法
  8. }
  9. }
  10. }

  
  1. namespace 计算器
  2. {
  3. public class DivFactory:IFactory
  4. {
  5. public Operation CreateOperation()
  6. {
  7. return new OpertionDiv();//除法
  8. }
  9. }
  10. }

 

 

结果:

 

文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。

原文链接:kangshihang.blog.csdn.net/article/details/102904817

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。