设计模式-简单工厂模式

简单工厂模式

学习自

大话设计模式

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语句增加一个新的分支即可。

原文地址:https://www.cnblogs.com/slyfox/p/7644672.html