• 初识设计模式之--简单工厂


    作为一个刚刚入门的菜鸟。虽只学到了些许编程语言的皮毛(或者连皮毛都算不上),但是随着时间和学习的深入,"设计模式"这一专业术语便慢慢浮现在眼前。

    到底何为设计模式呢?它的出现将会给我们带来哪些帮助?......等等一系列问题便会出现在我们脑海中。俗话说:问题才是探究知识的钥匙。就让我们带着

    自己的疑问一同来学习设计模式。

    首先,我们先来认识一下什么是设计模式,以及运用设计模式的优点。

    设计模式的简单理解:模式是在某一背景下某个问题的一种解决方案。
    1、复用解决方案——通过复用已经公认的设计,我能够在解决问题时取得先发优势,而且避免重蹈前人覆辙。我可以从学习他人的经验中获益,用不着为那些总是会重复出现的问题再次设计解决方案了。
    2、确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。
    3、提高观察高度--模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角,这将使我们从“过早处理细节”的桎梏中解放出来。
    4、大多数设计模式还能使软件更容易修改和维护。其原因在于,它们都是久经考验的解决方案。所以,它们的结构都是经过长期发展形成的,比新构思的解决方案更善于应对变化。而且,这些模式所用代码往往更易于理解——从而使代码更易维护。

    在这里,设计模式可以看做是对解决某种问题所采取相对应的解决方案的统称。

    设计模式一共包含了23种,其中有五种是经常在开发中用到的,相信大家已早有耳闻,我也不在此多啰嗦,下面就进入正题:设计模式之——简单工厂。

    我们将通过一个简单的例子来对简单工厂进行学习。

    多态计算器

    输入两数,选取任意算法计算两数的结果。

    我们先用多态的方式解决:

    1.类的创建

    2.关键代码

     1 Operation operation = new Operation();
     2                 switch (cmbCountWay.SelectedItem.ToString().Trim())
     3                 {
     4                     case "+":
     5                         operation = new OperationAdd();
     6                         break;
     7                     case "-":
     8                         operation = new OperationSubtraction();
     9                         break;
    10                     case "*":
    11                         operation = new OperationMultiplication();
    12                         break;
    13                     case "/":
    14                         operation = new OperationDivision();
    15                         break;
    16                     default:
    17                         break;
    18                 }
    19                 //进行计算
    20                 operation.FirstNum = double.Parse(txtFirstNum.Text.Trim());
    21                 operation.SecondNum = double.Parse(txtSecondNum.Text.Trim());
    22                 double result = operation.GetCount();
    23                 this.txtResult.Text = result.ToString();
    View Code

    通过代码我们会发现:

    我们在编程的时候,每当"new"一个对象之后,这个对象就依赖于这个类了。如果在后期的维护过程中由于某些原因需要修改一下这个类,则唯一的做法就是打开源代码,进行修改,修改所有与这个对象有关的操作。这对我们是非常不利的。
    问题出来了:对象不能应对“具体实例化类型”的变化
    解决思路:封装变化点,哪里变化,封装哪里。在这个例子中,要实例化的类变了,就将实例化这个操作封装起来,我们可以把"new"这个操作移交一个具体的类,由它去负责根据我们的条件创建具体类的实例,也就是下面要说的“简单工厂模式”。

    只需添加一个工厂类,通过传来的计算符号制造计算方法。

     public class OperatorFactory
        {
            public static Operator CreatOperator(string oper)
            {
                Operator calc = null;
                switch (oper)
                {
                    case"+":
                        calc = new Add();
                        break;
                        case"-":
                        calc = new Sum();
                        break;
                        case"*":
                        calc = new Mul();
                        break;
                        case"/":
                        calc = new Div();
                        break;
                }
                return calc;
            }
        }
    OperatorFactory
     private void btnCount_Click(object sender, EventArgs e)
            {
                int numLeft = Convert.ToInt32(txtNumLeft.Text);
                int numRight = Convert.ToInt32(txtNumRight.Text);
                string oper = cmbOperator.SelectedItem.ToString();
                Operator calc = OperatorFactory.CreatOperator(oper);
                try
                {
                    calc.NumLeft = numLeft;
                    calc.NumRight = numRight;
                    txtResult.Text = calc.Operation().ToString();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
    Main()

    从上面的代码对比,我们不难看出:

    (简单工厂)优点:

    • 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对  象的尴尬局面中摆脱出来。
    • 外界与具体类隔离开来,偶合性低。
    • 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

    缺点:

    • 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。(如何进行更一步的优化改进还需要我继续学习)

    应用情景

    • 工厂类负责创建的对象比较少 
    • 客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心 

    兵法有三十六计...三十六计是对历代杰出军事家实战经验的总结,以利后人学习兵法...上者领悟其神不拘一格可成兵法家,中者融会贯通运用得当可成大将军,下者只知形式循规守据可拿来唬人...

    武术有套路...套路是对各门派前辈高手实战经验的总结,将一连串攻防常用的招式串连起来以利后人纪录、操练...上者领悟其神不拘一格可成武术家,中者融会贯通运用得当可成一派高手,下者只知形式循规守据可拿来唬人...

    设计模式则是对以前的编程高手开发经验的总结,以利后人学习...上者领悟其神不拘一格可成传说中的大牛,中者融会贯通运用得当可拿高薪,下者只知形式循规守据可拿来唬人...

    只从书本上学、只听别人讨论却没有在实战中自己去领悟就只能做到拿来唬人...(所以建议多多运用,慢慢体味)

    如果你学了在实战中还看不出有什么好处就没事儿拿出来唬人吧... 

  • 相关阅读:
    CentOS 7 手动安装Mysql 5.7步骤
    OneNote无法登录
    在CDH集群外提交Spark流处理程序报错NoClassDefFoundError kafka consumer
    在VSCode中格式化Vue代码末尾不加分号双引号变单引号
    修改sudoers
    Dolphin Scheduler初始化Postgresql数据库失败
    centos7虚拟机分配静态IP但是得不到IP、不能上网一种可能的原因和解决办法
    安装GCC-8.3.0及其依赖
    REdis zset和double
    REdis Asynchronous AOF fsync is taking too long
  • 原文地址:https://www.cnblogs.com/Serean/p/4644121.html
Copyright © 2020-2023  润新知