简单工厂模式

背景需求:

用面向对象语言实现一个计算器控制台程序,要求输入两个数和运算符号,得到结果。

标准:

代码规范,通过封装、继承、多态把程序的耦合度降低,程序灵活,易于修改和复用。

主要类图

1、加减乘除类继承Operation运算类

2、简单运算工厂类作为一个单独的类,用来创造实例。

代码部分如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ConsoleApplication1
{class Program{static void Main(string[] args){try{Console.WriteLine("请输入数字A:");string strNumberA = Console.ReadLine();Console.WriteLine("请选择运算符号(+、-、*、/):");string strOperate = Console.ReadLine();Console.WriteLine("请输入数字B:");string strNumberB = Console.ReadLine();string strResult = "";strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));Console.WriteLine("结果是:" + strResult);Console.ReadLine();}catch (Exception ex){Console.WriteLine("您输入有错:" + ex.Message);}}}//业务逻辑和界面逻辑分开//Operation运算类public class Operation{public static double GetResult(double numberA, double numberB, string operate){double result = 0d;switch (operate ){case "+":result =numberA +numberB;break;case "-":result =numberA -numberB;break;case "*":result =numberA*numberB;break;case "/":result =numberA/numberB;break;} return  result;}}
}


运行结果:

其结构图为:

而类似的例子在工厂方法模式的结构图为

工厂方法模式

背景需求:雷锋依然在人间。

1、雷锋帮老人扫地、洗衣、买米等

//雷锋类class LeiFeng{public void Sweep(){Console.WriteLine ("扫地");}public void Wash(){ Console.WriteLine("洗衣");}public void BuyRice(){Console.WriteLine("买米");}}

2、三个学雷锋的大学生要代替他去做这些事情,并且大学生总要毕业的,这时候就要社区志愿者来帮忙干同样的事情了。

 //学雷锋的大学生,继承“雷锋”class Undergraduate : LeiFeng{ }//社区志愿者class Volunteer : LeiFeng{ }

3、简单工厂类

//简单雷锋工厂类class SimpleFactory{public static LeiFeng CreateLeiFeng(string type){LeiFeng result = null;switch (type ){case  "学雷锋的大学生":result =new Undergraduate ();break ;case "社区志愿者":result =new Volunteer ();break ;}return result ;}}

4、每次实例化的时候写出这个工厂的代码,为了避免重复,我们尝试用工厂方法模式写一遍。

 //雷锋工厂interface IFactory{LeiFeng CreateLeiFeng();}//学雷锋的大学生工厂class UndergraduateFactory : IFactory{public LeiFeng CreateLeiFeng(){return new Undergraduate();}}//社区志愿者工厂class VolunteerFactory : IFactory{public LeiFeng CreateLeiFeng(){return new Volunteer();}}

5、客户端调用

 static void Main(string[] args){//工厂方法模式IFactory factory = new UndergraduateFactory();LeiFeng student = factory.CreateLeiFeng();student.BuyRice();student.Sweep();student.Wash();}

运行结果:

简单工厂VS工厂方法相关推荐

  1. 设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. 用C#(.NET Core) 实现简单工厂和工厂方法设计模式

    本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. 这就是一个具体的类, 为了更灵活, 我们应该使用的是 ...

  4. 简单工厂抽象工厂工厂方法_让工厂美丽

    简单工厂抽象工厂工厂方法 每个名副其实的Java程序员都知道Factory Pattern . 这是一种便捷,标准化的方法,它通过教一个组件如何捕鱼而不是将它们交给它们来减少耦合. 但是,在使用大型系 ...

  5. getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...

    文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...

  6. 设计模式(一)----简单工厂、工厂方法和抽象工厂区别

    首先他们都属于创建型模式,除此之外还有建造者模式(如stringbuilder),单例模式. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的 ...

  7. 【设计模式】简单工厂模式+工厂方法模式+抽象工厂模式

    前提导论 故事 不采用工厂模式 简单工厂模式 工厂方法模式 故事 抽象工厂模式 故事结局 前提导论 为了学习设计模式时便于理解,我将用基于农夫和他的村子与森林为背景环境,讲一个故事时,阐述一个设计模式 ...

  8. 工厂模式(简单工厂,工厂方法,抽象工厂)

    工厂顾名思义就是创建产品,工厂分为三种:简单工厂,工厂方法,抽象工厂.该模式用于封装和管理对象的创建,是一种创建型模式. 1)简单工厂 该模式通过向工厂传递类型来指定要创建的对象 提供一个方法,根据类 ...

  9. UML图解简单工厂模式工厂方法模式抽象工厂模式区别

    简述 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一: 工厂模式包含 简单工厂模式& 工厂方法模式& 抽象工厂模式这三种: 这三者主要区别在于工厂实现的 ...

  10. 简单工厂、工厂方法、抽象工厂

    普通工厂产出是一个产品(实例),抽象工厂产出是一个抽象(接口).区别在于,若添加一个新的产品,前者是修改工厂,后者是创建新工厂(符合"闭合原则"). 1.简单工厂其实不是一个标准的 ...

最新文章

  1. 是时候开始使用JavaScript严格模式了怎样启用javascri
  2. MySQL数据库MyISAM存储引擎转为Innodb
  3. redis4.0.2集群搭建
  4. TOJ 4095: love168yk的选美大赛
  5. pythonos pathjson_Python Json数据文件操作原理解析
  6. nginx.conf删除与否网页都能访问(nginx没有生效)的问题
  7. SAP Spartacus store里引用的library是如何编译出来的
  8. java编译命令 Linux,通过命令行在linux中编译Java类
  9. Android小项目之--服务【Service】
  10. Oracle的分页实现
  11. redis入门——服务器篇
  12. bat 命令行执行 java(jar)获取返回值 【ERRORLEVEL、System.exit(code)】
  13. Display yuv formatted video by shader
  14. BZOJ_1003_[ZJOI2006]_物流运输_(动态规划+最短路)
  15. PUT 还是 POST ?
  16. SC;FC;LC;光纤接口介绍
  17. 在IntelliJ IDEA下编辑jspx文件(转)
  18. 案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)
  19. 2019,华为一号文
  20. (个人)太极拳学习系统创新实训第一周(一)

热门文章

  1. Lyndon的量化修炼之路——随机指标(KDJ)优化策略(二)
  2. Guitar Pro吉他调音软件之泛音的应用
  3. 设置花生壳和radmin远程访问一台无固定IP的电脑
  4. nginx 手机版页面判断_Nginx if 条件判断
  5. 智慧养老发展趋势和智慧养老存在几大问题
  6. 大规模稀疏数据分布式模型训练+Anakin Optimizaiton
  7. 046ToolStrip类
  8. 用vue做轮播图 关于require的用法
  9. try—catch—finally中,如果catch中return了,finally还会执行吗?
  10. 机房收费系统—报表建立