zoukankan      html  css  js  c++  java
  • 【设计模式】简单工厂模式

    简单工厂模式



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

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

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


     

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

     

     
    变动
    长处
    不足

    备注


    面向过程

    -------


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


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

    让计算和显示分开

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

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

    再改动算法时。不用提供其他算法代码


    计算器不知用哪个算法


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

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

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

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


    这就是简单工厂模式


    UML 图 

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

     

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

    一切也明朗和easy起来。




    生活中的简单工厂模式



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

    情景一:各地空气质量。

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

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

    单扩展。就拿来用。

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

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

    个地去宣传。

    周三周四没课的人少。就少安排几个地方。

    可是他们的流程都一样的。

    先定义一个父类“流程”。在定义子类中去重写方法。依据各自的不同地点或方式再去重写。用一个工厂去实例化它,这样。哪一天10期的也參加宣传,就能够再工厂中加入一个类。

    并实例就好了。

    情景三:五一出游。

    同学们都在准备着到哪去玩呢。

    我们也来给旅行社做个工厂模式吧。

    旅行社有5条路线。

    北京一日游。天津一日游等。界面方面,涉及到游客姓名 人数 时间等,这样不管在windows 还是在web 在手机上都能够复用。业务方面他们都会涉及票价,行程,注意事项,做一个基类,然后子类中再去重写方法。用简单工厂模式去做。假设学生们都反映想去白洋淀,旅行社还能够再不影响其他类时进行加入。假设最近优惠打折也非常灵活的改动。



    须要注意的是,假设再加入别的运算类如幂运算。要先加幂运算的类,然后去更改工厂的方法,其中加‘case’语句来推断。这样,实际上是对扩展开放了。也对改动开放了,也就是违背了“开放-封闭”原则。

    改正也非常easy,用反射技术来去除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();
    
      
         
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4733222.html
Copyright © 2011-2022 走看看