【设计模式】简单工厂模式

简单工厂模式



设计模式中,计算器的加减乘除或再外加其他的运算时,对其进行实例化,就可以用到简单工厂模式。

用一个单独的类来做这个创造实例的过程,这就是工厂。

从《大化设计模式》中,思维在不断的碰撞,让我们在来回顾一下计算器的编写过程中一步步的关键变化。


 

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

 

 
变动
优点
不足

备注


面向过程

-------


windows等的计算器代码不能很好复用


不易维护,不灵活,不易扩展,不易复用

让计算和显示分开

再写一个windows程序中计算器   也可直接复用运算类
若让小菜加一个开跟运算,他可趁机将自己工资部分代码修改
因为,所有运算都在一起。修改一个可能影响另一个
计算部分分为运算类和子类

子类继承父类重写  GetResult()方法,

再修改算法时,不用提供其它算法代码


计算器不知用哪个算法


运算类中,有两个Number属性,用于计算器的前后数,然后有一个虚方法GetResult(),用于得到结果

用一个单独的类来做创造实例的过程

只要输入运算符号,工厂就能实例化出合适的对象也易于以后对算法的增加修改。

----------------


这就是简单工厂模式


UML 图 

我们用UML图来看看它的模式

 

后记:真心觉得小菜的觉悟好高-_-|||,不过在他改变的过程中,我们也一次次的体会着编程的艺术之美。一切源于生活,学习也是如此啊,回归生活,就会多一份韵味。一切也明朗和容易起来。




生活中的简单工厂模式



心想,如果我有这样一个工厂,我会用它来生产什么呢?

情景一:各地空气质量。

关心一下廊坊的质量,再看一看北京的,当然还有老家的空气质量也要特

别关注啦。我用一个工厂“生产”它们,等哪天我去了海南照样可以简

单扩展,就拿来用。

情景二:11期的在作品展宣传。

也给他们做一个工厂模式,可能几天里,周一周二的没课的人多,就多安排几

个地去宣传。周三周四没课的人少,就少安排几个地方。但是他们的流程都一样的。先定义一个父类“流程”,在定义子类中去重写方法,根据各自的不同地点或方式再去重写。用一个工厂去实例化它,这样,哪一天10期的也参加宣传,就可以再工厂中添加一个类。并实例就好了。

情景三:五一出游。

同学们都在准备着到哪去玩呢。我们也来给旅行社做个工厂模式吧。

旅行社有5条路线。北京一日游,天津一日游等。界面方面,涉及到游客姓名 人数 时间等,这样无论在windows 还是在web 在手机上都可以复用。业务方面他们都会涉及票价,行程,注意事项,做一个基类,然后子类中再去重写方法。用简单工厂模式去做。如果学生们都反映想去白洋淀,旅行社还可以再不影响其它类时进行添加。如果近期优惠打折也很灵活的修改。



需要注意的是,如果再添加别的运算类如幂运算,要先加幂运算的类,然后去更改工厂的方法,当中加‘case’语句来判断。这样,实际上是对扩展开放了,也对修改开放了,也就是违背了“开放-封闭”原则。 改正也很简单,用反射技术来去除switch或if,解除分支判断带来的耦合。 欢迎关注我的设计模式系列博客~


附:以下是最终计算器的艺术化身,让我们一起来体会自始至终它的变化和动态之美。



代码

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//用一个单独的类来做这个创造实例的过程

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;
}
    /// <summary>
    ///   继承后重写result
    /// </summary>
    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
{
 double  result=0;
    if(NumberB==0)
       throw new Exception ("除数不能为0.");
        result =NumberA/NumberB;
        retrun result;

    

)
}
/// <summary>
/// 简单工厂模式
/// </summary>
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;
}
}
/// <summary>
/// 界面的实现
/// </summary>
 Operation oper;
     oper =OperationFactory.createOperate("+");
    oper.NumberA = 1;
    oper.NumberB = 2;
    double result=oper.GetResult();

  
     
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值