简单工厂模式

前言:

(主要根据《大话设计模式》来学习)

作为一个不想尽快上手第二份工作的无业游民,为了提升自己的价值,于是想学下设计模式。

第一次接触设计模式这个概念,是在上学期间,老师介绍的,当时还让学了好几个模式,可当时愚蠢无知,没有用心,所以只是脑子里知道这个词。

目前来讲,我是这样理解设计模式的:

它是编程套路的总结,它有好几种套路即好几种模式。在编程即写代码时,运用设计模式可以让自己的代码具有比较好的可扩展性、可维护性以及可重复利用。至于具体怎么用,我倒是几乎没有什么经验,所以好处我也没体验过,哎~,当时无知,上一份工作期间又懒,故现在跟它只是“一面之缘”。至于为什么我认为它是我应该学的,因为在我目前需要加强或补充的知识中,它是比较容易做到的,而且这本书我之前有大概看了一章,感觉并不难理解还挺有趣、靠谱,几乎算是手把手的教了。另外,比较无脑的一个原因,曾经一老师介绍过,而他介绍过的许多东西在我工作期间都常用到,所以,我对他有个盲目的信任,故我想先学这个。

那么“设计模式”到底是个什么概念呢?【这里抽时间再补充,我记得有本书上有介绍,官方应该也可以搜到】

 

正文:

一:“代码的可维护性、可扩展性、可复用性”

应该是一句常听的的词,那具体的是怎么一回事呢?利用类比能比较很好的说明某个概念或问题,书中用的是“活字印刷术”来解释的,很有意思,我就把我get到的文绉绉的来表述一下:可维护性即代码某个地方不满足要求了,但能很快定位到是哪些代码段,并能换上新的代码,且改完后与其它代码不冲突,就好比给车换了一个轮子一样。可扩展性就是比如你的系统在后期需要加一个小功能,只要这个功能实现了某个接口就能在系统中流畅运行  。可复用性就是字面意思了,当在别的项目中实现类似功能时,你的代码可以直接copy过来用,或者你的代码可以实现在不同的场景下也能发挥作用等。

二:“编程有一个原则,就是尽量避免重复”。

还有,类图是个不错的东西,书上介绍的很详细了,可以了解下,但是去年工作一年,没有用到过,不清楚别处是怎样的一个情况。

三:简单工厂模式

概念:简单工厂模式就是用来处理实例化的问题。比如一个抽象类有好几个实现类,当你要根据不同的情况来获取不同的实例时,考虑用这个模式,当然,比如用switch也可以解决问题,但这样的话,每次实例化都是有个判断“1234”的过程,而简单工厂模式往往是一句代码就搞定了实例化的问题,有种“直达”的感觉。

四:示例代码

要求:使用任何一个面向对象语言,写一个控制台应用程序,要求根据两个数进行四则运算。

=>进行运算的类

/// <summary>
    /// 抽象类
    /// </summary>
    public abstract class NumberOperate
    {
        public double NumberA { get; set; }
        public double NumberB { get; set; }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    public class NumberOperateAdd : NumberOperate
    {
        public override double GetResult()
        {
            return NumberA + NumberB;
        }
    }
    public class NumberOperateMinus : NumberOperate
    {
        public override double GetResult()
        {
            return NumberA - NumberB;
        }
    }
    public class NumberOperateMul : NumberOperate
    {
        public override double GetResult()
        {
            return NumberA * NumberB;
        }
    }
    public class NumberOperateDiv : NumberOperate
    {
        public override double GetResult()
        {
            return NumberA / NumberB;
        }
    }

 

=》progorm类:

 

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace JiSuanQi
{
    /// <summary>
    /// 工厂类
    /// </summary>
    public class NumberOperateFactory
    {
        /// <summary>
        /// 工厂方法【通常是静态的、返回类型是抽象类或接口】
        /// </summary>
        /// <param name="operateMark"></param>
        /// <returns></returns>
        public static NumberOperate CreateOperate(string operateMark)
        {
            NumberOperate currOperate = null;
            switch (operateMark)
            {
                case "+":
                    currOperate = new NumberOperateAdd();
                    break;
                case "-":
                    currOperate = new NumberOperateMinus();
                    break;
                case "*":
                    currOperate = new NumberOperateMul();
                    break;
                case "/":
                    currOperate = new NumberOperateDiv();
                    break;
                //如果想新增新的运算方式,要在下面追加相应的case
                //case "%":
                //    currOperate = new NumberOperateDiv();
                //    break;
                default:
                    //new NumberOperateFactory();
                    break;
            }
            return currOperate;
        }
    }

    /// <summary>
    /// 验证类
    /// </summary>
    public class ValidateInput
    {
        /// <summary>
        /// 判断是输入的是否是实数
        /// </summary>
        /// <param name="inputStr"></param>
        /// <returns></returns>
        public static bool IsNumber(string inputStr)
        {
            string pattern = "^(-)?[0-9]*(.)?[0-9]*$";
            Regex regex = new Regex(pattern);
            return regex.IsMatch(inputStr);
        }

        /// <summary>
        /// 判断是否支持该运算符
        /// </summary>
        /// <param name="operateMark"></param>
        /// <returns></returns>
        public static bool IsSupportOperate(string operateMark)
        {
            List<string> lsOperate = new List<string> { "+", "-", "*", "/" };
            return lsOperate.Contains(operateMark);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Program program = new Program();
            start: Console.WriteLine("根据输入的两个数,进行加、减、乘、除运算。\n 请输入第一个数:");
            string firstStr = Console.ReadLine().Trim();
            bool isNumber = ValidateInput.IsNumber(firstStr);
            while (isNumber == false)
            {
                Console.WriteLine("输入有误,请重新输入:");
                firstStr = Console.ReadLine();
            }
            double numberA = double.Parse(firstStr);

            Console.WriteLine("请输入运算符号(+、-、*、/):");
            string operateMark = Console.ReadLine().Trim();
            while (!ValidateInput.IsSupportOperate(operateMark))
            {
                Console.WriteLine("输入有误,请输入运算符号(+、-、*、/):");
                operateMark = Console.ReadLine().Trim();
            }
            Console.WriteLine("根据输入的两个数,进行加、减、乘、除运算。\n 请输入第二个数:");
            secondNum: string secondStr = Console.ReadLine();
            isNumber = ValidateInput.IsNumber(secondStr);
            while (isNumber == false)
            {
                Console.WriteLine("输入有误,请重新输入:");
                secondStr = Console.ReadLine();
            }
            double numberB = double.Parse(secondStr);
            if (operateMark == "/" && double.Parse(secondStr) == 0)
            {
                Console.WriteLine("除数不能为零。\n 请输入第二个数:");
                goto secondNum;
            }
            //这里运用工厂方法,根据参数不同,获取不同的对象。
            NumberOperate currOperate = NumberOperateFactory.CreateOperate(operateMark);
            currOperate.NumberA = numberA;
            currOperate.NumberB = numberB;
            double result = currOperate.GetResult();
            Console.WriteLine($"{numberA} {operateMark} {numberB} = {result}");
            Console.ReadLine();
            goto start;

        }
    }
}

=》运行结果:

image

书中鸡汤:

‘编程是一门技术,更加是一门艺术,不能只满足于写完代码运行结果正确就完事,时常考虑如何让代码更加简练,更加容易维护,容易扩展和服用,只有这样才可以真正得到提高。’

发现:

通过这一章的学习,我发现自己的封装、继承、和多态几乎都忘了,只是有些隐隐的概念,需要下去补充,还有接口也快忘光了,因为过去一年我竟几乎没怎么用过。还有正则表达式,这个得熟练一下,之前写JS代码会常用到,后台代码有些时候也是有可能用到的。

转载于:https://www.cnblogs.com/gds-1202b/p/10581132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值