C# 设计模式练手(一):简单类工厂

引言

面向对向程序设计的三大特征是: 封装,继承,多态

平时做设备的程序用得最多的还是封装,或者还有一些基于局部功能性的继承。真心来说程序仅仅是为了实现功能,还远远谈不上真正的是面向对象开发。

当然这也是有原因的:

一方面,设计模式并不是直接写出来的,而是重构代码改出来的(至少勇哥是这么认为的)。在完成了设备功能的情况下,往往因为时间关系,不可能再重构代码,因为当设备开始进行生产状态后,客户认为再去动代码是有风险的。

另一方面,人还是有惰性,当初研究面向对象、设计模式的时候的那股劲随着被工作不断打断后,慢慢淡化下来了,我想如果勇哥可以不出差,一直在公司做标准设备的话,也许这股冲劲会更持久一些。

面向对象、设计模式这些知识的实践,是由一个程序菜鸟达到凤凰涅盘的关键过程,之后写出来的代码会达到艺术化并且兼顾实用性的一种境界,这个境界想想都令人激动万分。

勇哥想借助于这个网站,把这些知识重温起来,虽然时间有限,但是缓慢地,用心并持续下去,还是可能圆梦初心的。



下演示程序是关于设计模式“简单类工厂”。

看上去很简单,但是其中包含的思想已经用到了面向对象的全部特征。

勇哥在后面会附上原书的关键部分的内容,各位读过以后再看演示程序收获会大许多。


image.png


测试代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace calculate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
            btnCal.Click += new EventHandler(btnCal_Click);
        }

        void btnCal_Click(object sender, EventArgs e)
        {
            double numA, numB;
            if (double.TryParse(this.tbNumA.Text, out numA) &&
            double.TryParse(this.tbNumB.Text, out numB))
            {
                operFactory factory = new operFactory(cbbSymbol.Text,numA,numB);
                label1.Text = factory.getResult().ToString();
            }


        }

        void Form1_Load(object sender, EventArgs e)
        {
            cbbSymbol.Items.Add("+");
            cbbSymbol.Items.Add("-");
            cbbSymbol.Items.Add("*");
            cbbSymbol.Items.Add("/");
            cbbSymbol.SelectedIndex = 0;
        }
    }

    public class operFactory
    {
        private operation op = null;
        private double _numa;

        public double Numa
        {
            get { return _numa; }
            set { _numa = value; }
        }
        private double _numb;

        public double Numb
        {
            get { return _numb; }
            set { _numb = value; }
        }
        public operFactory(string symbol,double numa,double numb)
        {
            this._numa = numa;
            this._numb = numb;
            switch (symbol)
            {
                case "+":
                    op = new add();
                    break;
                case "-":
                    op = new sub();
                    break;
                case "*":
                    op = new mul();
                    break;
                case "/":
                    op = new div();
                    break;
                default:
                    break;
            
            }
        }

        public double getResult()
        {
            if (op != null)
            {
                op.NumberA = this._numa;
                op.NumberB = this._numb;
                return op.calResult();
            }
            else
                return 0;
        }

    }

    public class operation
    {
        private double _numberA;

        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        private double _numberB;

        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }

        public virtual double calResult()
        {
            return 0;
        }

    }

    public class add : operation
    {
        public override double calResult()
        {
            return NumberA + NumberB;
        }
    }

    public class sub : operation
    {
        public override double calResult()
        {
            return NumberA - NumberB;
        }
    }

    public class mul : operation
    {
        public override double calResult()
        {
            return NumberA * NumberB;
        }
    }

    public class div : operation
    {
        public override double calResult()
        {
            return NumberA / NumberB;
        }
    }



}


本文主题的起因

image.png

小菜的程序是这样的:

image.png

小菜的程序是过程式的写法,没有理解面试单位的的要求,对方是要求用面向对象的设计方式来写代码。

大鸟由此介绍了面向对象设计方法的好处,以及提出一个新要求,引导小菜往面向对象的思维方式上去想:

image.png

image.png


经过启发,小菜写出了第一版面向对象的程序:

image.png

image.png

客户端代码:

image.png

由于小菜这一版程序只用到了面向对象中的“封装”,所以继续引导他,假设客户增加需求的时候该怎么办?

image.png

小菜经过考虑,写出了一版利用上了继承和多态的代码

Operation运算类

image.png

image.png

image.png

image.png

这个代码引出了一个新的问题,这个问题引出了本文的主题,一种设计模式“简单类工厂”

image.png

image.png

image.png

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。
  • 评论列表:
  •  初七
     发布于 2020-07-07 10:56:23  回复该评论
  • 简单易懂。生动活泼。。不错不错

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«   2020年8月   »
12
3456789
10111213141516
17181920212223
24252627282930
31
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
标签列表
搜索
最新留言
最近发表
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:

Powered By Z-BlogPHP 1.6.0 Valyria

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864