题目:计算器

解析:工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。

定义运算类:

  1. class Operation
  2. {
  3. private double _numberA = ;
  4. private double _numberB = ;
  5.  
  6. public double NumberA
  7. {
  8. get
  9. {
  10. return _numberA;
  11. }
  12.  
  13. set
  14. {
  15. _numberA = value;
  16. }
  17. }
  18.  
  19. public double NumberB
  20. {
  21. get
  22. {
  23. return _numberB;
  24. }
  25.  
  26. set
  27. {
  28. _numberB = value;
  29. }
  30. }
  31.  
  32. public virtual double GetResult()
  33. {
  34. double result = ;
  35. return result;
  36. }
  37. }

继承于运算类的具体运算的实现:

  1. class OperationAdd : Operation
  2. {
  3. public override double GetResult()
  4. {
  5. double result = ;
  6. result = NumberA + NumberB;
  7. return result;
  8. }
  9. }
  10.  
  11. class OperationSub : Operation
  12. {
  13. public override double GetResult()
  14. {
  15. double result = ;
  16. result = NumberA - NumberB;
  17. return result;
  18. }
  19. }
  20.  
  21. class OperationMul : Operation
  22. {
  23. public override double GetResult()
  24. {
  25. double result = ;
  26. result = NumberA * NumberB;
  27. return result;
  28. }
  29. }
  30.  
  31. class OperationDiv : Operation
  32. {
  33. public override double GetResult()
  34. {
  35. double result = ;
  36. if (NumberB == )
  37. throw new Exception("除数不能为0");
  38. result = NumberA / NumberB;
  39. return result;
  40. }
  41. }

工厂方法,接口:

  1. interface IFactory
  2. {
  3. Operation CreateOperation();
  4. }

工厂方法,分别子类:

  1. class AddOperation : IFactory
  2. {
  3. public Operation CreateOperation()
  4. {
  5. return new OperationAdd();
  6. }
  7. }
  8.  
  9. class SubOperation : IFactory
  10. {
  11. public Operation CreateOperation()
  12. {
  13. return new OperationSub();
  14. }
  15. }
  16.  
  17. class MulOperation : IFactory
  18. {
  19. public Operation CreateOperation()
  20. {
  21. return new OperationMul();
  22. }
  23. }
  24.  
  25. class DivOperation:IFactory
  26. {
  27. public Operation CreateOperation()
  28. {
  29. return new OperationDiv();
  30. }
  31. }

主函数:

  1. static void Main(string[] args)
  2. {
  3. //工厂模式自己内部确定了改实例化哪个类,所以要发生变动,只需要在最外面这个地方变动即可
  4. IFactory operFactory = new AddOperation();
  5.  
  6. Operation oper = operFactory.CreateOperation();
  7. oper.NumberA = ;
  8. oper.NumberB = ;
  9. double result = oper.GetResult();
  10.  
  11. Console.WriteLine(result);
  12.  
  13. Console.Read();
  14. }

注:文中所有代码及知识点均来自于《大话设计模式》,本人属于边学边看边敲代码边总结的阶段。

C#学习笔记-工厂模式的更多相关文章

  1. 《Head First 设计模式》学习笔记——工厂模式 + 抽象工厂模式

    设计模式 工厂模式:定义一个创建对象的接口,但由子类决定要实例化的是哪一个.工厂方法让类把实例化推迟到子类. 所谓的"决定",并非指模式同意子类本身在执行时做决定,而是指在编写创建 ...

  2. 学习笔记——工厂模式Factory

    Product是我们所需要获得的对象,一般的使用中,我们直接通过new获得新对象. 当需要大量获得对象时,每一次都new会很麻烦. <真菌世界>游戏中,一个星球上有很多树,一棵树会不断生成 ...

  3. Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式

    一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...

  4. Java-马士兵设计模式学习笔记-工厂模式-简单工厂

    一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...

  5. Java-马士兵设计模式学习笔记-工厂模式-用Jdom模拟Spring

    一.概述 1.目标:模拟Spring的Ioc 2.用到的知识点:利用jdom的xpath读取xml文件,反射 二.有如下文件: 1.applicationContext.xml <?xml ve ...

  6. Java-马士兵设计模式学习笔记-工厂模式-模拟Spring读取Properties文件

    一.目标:读取properties文件,获得类名来生成对象 二.类 1.Movable.java public interface Movable { void run(); } 2.Car.java ...

  7. Java-马士兵设计模式学习笔记-工厂模式-单例及多例

    一.单例的作用是用于控制类的生成方式,而不让外部类任意new对象 1.Car.java import java.util.ArrayList; import java.util.List; publi ...

  8. 《Head first设计模式》学习笔记 – 迭代器模式

    <Head first设计模式>学习笔记 – 迭代器模式 代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了!真是个 ...

  9. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

随机推荐

  1. arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++: Command not found 解决方法

    执行下列命令时: ndk-build -j16 出现如下错误: Android NDK: WARNING: Ignoring unknown import directory: jni/../../. ...

  2. intellij idea svn使用一 导入、更新、提交、解决冲突

    大体上是转载,针对版本14有一些特殊的添加. 查看svn的资源库: 下面的多出了一个svn的窗口,在左边有加号可以添加一个svn的库 输入svn的地址,我用的是本地的测试,所以地址为svn://127 ...

  3. 2017年国内常用的公共NTP服务

    安卓机顶盒里常用的 http://cn.pool.ntp.org CERNET 的一堆服务器就在那里面 http://asia.pool.ntp.org 追踪它的IP,台湾.韩国.日本都有. 阿里云 ...

  4. 【python】入门:打印字符串、简单计算

  5. Swift3.0 自定义tableView复用cell 的写法,与CollectionViewCell的不同,数据model

    Model数据 class HospitalModel: NSObject { //后边不赋值 会报错 var imgurl :String = "" var introducti ...

  6. 函数的非固定参数-Day3

    一.函数非固定参数 1.默认函数,我们在传参之前,选给参数指定一个默认的值.默认参数特点是非必须传递的. def test(x,y=2): print(x) print(y) print(" ...

  7. Xamarin截取/删除emoji表情bug解决方案

    大家都知道,一个英文=1字节,一个汉字2字节,而一个emoji表情=4个字节,在有这三种混用的时候,比如app聊天界面,那么删除和截取便成了很头痛的事情. 问题描述 截取导致乱码,如下图: 解决方案 ...

  8. Java 哲学家进餐

    某次操作系统实验存档.V 这个哲学家除了吃就知道睡.( ╯□╰ ) 哲学家.java: package operating.entity.philosophyeating; import operat ...

  9. bzoj 3999: [TJOI2015]旅游

    Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会 ...

  10. js中的call()方法与apply()方法

    摘自:http://blog.csdn.net/chelen_jak/article/details/21021101 在web前端开发过程中,我们经常需要改变this指向,通常我们想到的就是用cal ...