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();
    
      
         
    }
    


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

  • 相关阅读:
    Nginx TCP Proxy模块的编译安装
    树形dp hdu-4616-Game
    UVA 10405 Longest Common Subsequence (dp + LCS)
    MVC中使用EF(2):实现基本的CRUD功能
    [置顶] 关于Qt的学习
    BNU 26480 Horror List【最短路】
    汉语-词语-爱惜:百科
    汉语-词语-珍惜:百科
    汉语-词语-无知:百科
    汉语-词语-愚蠢:百科
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4733222.html
Copyright © 2011-2022 走看看