[设计模式]简单工厂模式
来源:互联网 发布:阿里云信任付怎么还款 编辑:程序博客网 时间:2024/05/17 23:08
前言
简单工厂模式是《大话设计模式》中的第一个模式,又叫做静态工厂方法(Static Factory Method)模式,它不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。也就是说,一个程序中,到式底要实例化谁,将来会不会增加实例化的对象,增加一些容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂。
内容
业务的封装就是将业务逻辑和界面逻辑分开,减低它们之间的耦合度,这样可以达到容易维护或扩展。
封装后代码:
namespace ConsoleApplication1{ class Program { static void Main(string[] args) { try { Console.Write("请输入数字A:"); string strNumberA = Console.ReadLine(); Console.Write("请选择运算符号(+、-、*、/):"); string strOperate = Console.ReadLine(); Console.Write("请输入数字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); } } } 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; } }}
上面代码很漂亮,但并不是最优的。若是想再加一个运算类直接改Operation类就可以了,但是若新的运算类需要调用加减乘除方法就不好改了。所以应该把加减乘数等运算类分离。
分离后代码:
public class Operation { private double _numberA = 0; private double _numberB = 0; public double NumberA { get { return _numberA; } set { _numberA = value; } } public double NumberB { get {return _numberB;} set { _numberB = value; } } public virtual double GetResult() { double result = 0; return result; } } //加法类,继承运算类 class OperationAdd : Operation { public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } //减法类,继承运算类 class OperationSub : Operation { public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } //乘法类 class OperationMul : Operation { public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } //除法类 class OperationDiv : Operation { public override double GetResult() { double result = 0; if (NumberB==0) { throw new Exception("除数不能为0"); } result = NumberA / NumberB; return result; } }}
上面代码有两个Number属性,主要用于计算器的前后数,然后有一个虚方法GetResult(),用于得到的结果,然后把加减乘数携程运算类的子类,继承它后重写了GetResult()方法,这样若修改任何一个算法,就不需要提供其他算法的代码了。但是如何让计算器知道希望调用的是哪一个算法呢?
这个时候就需要用到简单工厂模式了。
客户端代码:
static void Main(string[] args) { Operation oper; oper = OperationFactory.createOperate("+"); oper.NumberA = 1; oper.NumberB = 2; double result = oper.GetResult(); }
上面代码有两个Number属性,主要用于计算器的前后数,然后有一个虚方法GetResult(),用于得到的结果,然后把加减乘数携程运算类的子类,继承它后重写了GetResult()方法,这样若修改运算类代码:
public class OperationFactory { public static Operation createOperate(string operate) { Operation oper = null; switch (operate) { case"+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; } return oper; } }
这样只需要输入运算符号,工厂就可以实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果。
不管是控制台程序、Windows程序,Web程序,PDA或者手机程序,都可以用这段代码实现计算器的功能,若果需要更改某运算,只需更改某运算的类就好了,需要增加各种复杂运算时,只需增加相应的子类就可以了。
当然,修改界面直接修改就好了,和程序代码没有关系。
总结
通过简单工厂模式让我彻底的认识到之前写代码的不足,若是不懂这些东西,修改程序(增加或者修改模块)大都需要全部推翻重来。面向对象原来这么神奇,让我领略到了编程的思想。
就像书上说的:“编程是一门技术,更加是一门艺术。”
- 简单工厂设计模式
- 设计模式-----简单工厂
- 简单工厂设计模式
- 设计模式:简单工厂
- 设计模式 - 简单工厂
- 设计模式 简单工厂
- 【设计模式】【简单工厂】
- 简单工厂设计模式
- 简单工厂设计模式
- 设计模式--简单工厂
- 简单工厂设计模式
- 简单工厂设计模式
- 设计模式------------简单工厂
- 设计模式--简单工厂
- 简单工厂设计模式
- 设计模式---------简单工厂
- 设计模式--简单工厂
- 简单工厂设计模式
- 如何写出让自己满意的代码
- redis简介
- POJ2412(最简单的prim)
- centos7下使用yum安装mysql
- dom4j读写xml文件
- [设计模式]简单工厂模式
- 02图片加载_01_Android_Universal_Image_Loader
- FileInputStream和FileOutputStream应用
- 抽奖
- CentOS7下安装Disconf
- CCCC-GPLT L1-038. 新世界 团体程序设计天梯赛
- CPP_Basic_Code_P5.1-PP5.9.10
- 考试(2017年3月26日) (COCI)
- Web Hacking 101 中文版 十一、SQL 注入