码迷,mamicode.com
首页 > 其他好文 > 详细

简单工厂设计模式

时间:2019-11-28 01:09:56      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:不难   console   主题   throw   row   result   double   简单   case   

业务场景:设计一款计算器 提供加减乘除功能同时要满足松耦合高复用以及高拓展的特性。

一般情况:抛去上述的特性就实现简单的加减乘除的功能,大多数初级程序员可能和我一样首先脑中

浮现出的代码逻辑是这样的

        public static string Operate(int A, int B, string op)
        {
            string result = "";
            switch (op)
            {
                case "+":
                    result = (A + B).ToString();
                    break;
                case "-":
                    result = (A + B).ToString();
                    break;
                case "*":
                    result = (A + B).ToString();
                    break;
                case "/":
                    if (B == 0)
                    {
                        return "除数不能为:O";
                    }
                    result = (A / B).ToString();
                    break;
            }
            return result;
        }

这段看似简单的代码其实已经大致满足了我们上述提到的松耦合高复用以及高拓展的特性

松耦合:业务(计算方法)和界面分离实现了分离

高复用:任何使用到计算的地方都可以调用该方法完成对应的功能

高拓展:增加比如平方根这样的计算只要在switch中添加一个case以及对应计算逻辑即可

其实大多数我们都在使用这些特性其中高复用和松耦合是我们日常中最常用到的特性比如日常写的工具类、工具方法就能体现高复用这一特性,松耦合日常体现在接口层面,经典的三层架构及面向接口编程,这些只是个人理解是否完全准确大家做个参考就好。

其实面向对象中封装、继承、多态的三大特性更能体现松耦合、高复用以及高拓展。让我们用面向对象的思想 来实现上面计算器的功能。

    public class Operation
    {
        public double NumberA { get; set; }
        public double NumberB { get; set; }

        public virtual double GetResult()
        {
            return 0;
        }
    }
    public class Add : Operation
    {
        public override double GetResult()
        {
            return NumberA + NumberB;
        }
    }
    public class Sub : Operation
    {
        public override double GetResult()
        {
            return NumberA - NumberB;
        }
    }
    public class Mul : Operation
    {
        public override double GetResult()
        {
            return NumberA * NumberB;
        }
    }
    public class Div : Operation
    {
        public override double GetResult()
        {
            if (NumberB == 0)
                throw new Exception("除数不能为零");
            return NumberA / NumberB;
        }
    }
Operation oper = new Add();
oper.NumberA = 1;
oper.NumberB = 2;
Console.WriteLine(oper.GetResult());

这段代码就很好的利用了面向对象的思想去实现业务功能,首先是一个带有两个Number属性和一个虚方法GetResult的运算父类,然后是继承父类的四个运算子类这样我们就实现了面向对象的三个特性同时也更进一步的实现了松耦合(四种运算逻辑进行了分离)和高拓展(新增方法只需要新建一个类继承Operation类重写GetResult方法即可),至于高复用在这体现的并不是很明显。

但是这段代码有个问题,我们并不知道用户选择的是哪一种运算。这就引出了我们这一篇博文的主题简单工厂模式。简单工厂模式属于创建型设计模式,关注对象的创建。

废话不多说让我看看具体代码:

    public class OperationFactory
    {
        public static Operation CreateOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            {
                case "+":
                    oper = new Add();
                    break;
                case "-":
                    oper = new Add();
                    break;
                case "*":
                    oper = new Add();
                    break;
                case "/":
                    oper = new Add();
                    break;
            }
            return oper;
        }
    }
Operation oper = null;
oper = OperationFactory.CreateOperate("*");
oper.NumberA = 1;
oper.NumberB = 2;
Console.WriteLine(oper.GetResult());

结论:

从上面代码我们不难看出简单工厂解决的问题简单来说就是如何实例化对象以及实例化谁的问题。

同时我们也不难看出在一些简单的问题上运用设计模式可能会使简单的问题复杂化所以怎么样合理的运用设计模式要考虑使用设计模式的价值体现在哪,也就是使用设计模式后能为当前业务带来哪些优点。

 

题外话:第一次写博客有错误的地方各位大佬多多指点。。。。。

以上内容是个人阅读《大话设计模式》后写的算是加深印象从中加入了一些个人的理解和感悟

简单工厂设计模式

标签:不难   console   主题   throw   row   result   double   简单   case   

原文地址:https://www.cnblogs.com/azhi98/p/11946443.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!