• 设计模式-简单工厂模式


    简单工厂模式

    学习自

    大话设计模式

    Overview

    简单工厂模式,可以说是我们最常用的设计模式之一,顾名思义,简单工厂,就像现实生活中的工厂一样,是用来生产产品的,而在编程中,这个产品指的就是特定的对象。

    类图

    Demo(一个简单的计算机小程序)

    需求如下:

    ​ 实现一个简单的计算器功能,实现两个数的加减乘除等操作。

    初始代码:
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入第一个数");
            double numFirst = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入第二个数");
            double numSecond = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请选择运算符号:");
            string operation = Console.ReadLine();
    
            double result = 0;
            switch (operation)
            {
                case "+":
                    result = numFirst + numSecond;
                    break;
                case "-":
                    result = numFirst - numSecond;
                    break;
                case "*":
                    result = numFirst * numSecond;
                    break;
                case "/":
                    result = numFirst / numSecond;
                    break;
                default:
                    break;
            }
            Console.WriteLine("结果为: " + result);
    
            Console.ReadKey();
        }
    }
    

    思考

    ​ 上面的程序,看起来没有什么问题,并且测试结果也是正确的,那么,这是一个好的程序吗?NO,应为需求总是善变的,现在如果要让你在添加一种运算,比如说取模运算,可能这个需求可能改动的不是很大,但是现实中的业务肯定会更加的复杂,那么这时候修改一次的工作量就海了去了,并且现在的程序,UI和后台逻辑完全的耦合在了一起,万一到时候,需要对代码进行移植,比如说,换成Winfrom程序,这时候的工作量几乎是推到了从来。

    好的程序员是懒出来的(使用简单工厂模式解决上述问题)

    好的程序员是懒出来的,我们不要被重复的工作所困扰,通过简单工厂模式我们可以很好的处理和解决这个问题:类图如下:

    实现代码:

    Operation类

    namespace 学习设计模式_简单工厂模式
    {
        public abstract class Operation
        {
            public double NumFirst { get; set; }
    
            public double NumSecond { get; set; }
    
            public abstract double GetResult();
        }
    }
    

    Operation类的各个子类

    /// <summary>
    /// 实现加法运算
    /// </summary>
    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            return this.NumFirst + this.NumSecond;
        }
    }
    /// <summary>
    /// 实现减法运算
    /// </summary>
    public class OperationUSB : Operation
    {
        public override double GetResult()
        {
            return this.NumFirst - this.NumSecond;
        }
    }
    

    工厂类:

    public class OperationFactory
    {
        public Operation GgeOperation(string operationFlag)
        {
            Operation operation = null;
            switch (operationFlag)
            {
                case "+":
                    operation = new OperationAdd();
                    break;
                case "-":
                    operation = new OperationUSB();
                    break;
                default:
                    break;
            }
            return operation;
        }
    }
    

    调用

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("请输入第一个数");
            double numFirst = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入第二个数");
            double numSecond = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请选择运算符号:");
            string operationFlag = Console.ReadLine();
    
            OperationFactory factory = new OperationFactory();
            Operation operation = factory.GetOperation(operationFlag);
    
            operation.NumFirst = numFirst;
            operation.NumSecond = numSecond;
    
            double result = operation.GetResult();
            Console.WriteLine("最后结果为:" + result);
            Console.ReadKey();
        }
    }
    

    总结

    经过使用我们的简单工厂模式,代码量虽然多了很多,但是,这时候我们的前台和后台已经完全的分离了,如果想要移植的话,就会非常的简单了,而且,如果我们要添加一种新的运算,不要要进行很大的改动就可以完成,只需要新建一个类继承Operation并实现功能,然后为工厂类中的switch语句增加一个新的分支即可。

  • 相关阅读:
    第十一篇:Mysql系列
    mysql八:ORM框架SQLAlchemy
    mysql七:视图、触发器、事务、存储过程、函数
    mysql六:数据备份、pymysql模块
    工厂方法模式
    execution表达式
    CentOS系统下安装SVN及常用命令
    Spring Boot 表单验证、AOP统一处理请求日志、单元测试
    SSH文件上传代码片段
    JPA 实体映射
  • 原文地址:https://www.cnblogs.com/slyfox/p/7644672.html
Copyright © 2020-2023  润新知