• 简单工厂模式


    简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern)

    是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    这个模式并不属于GoF23里面的设计模式,其实他属于一个过渡的模式,这个模式是为了引出下一篇要将的模式:工厂模式

    目录

    1.UML图 

    2.简单工厂模式的伪代码

    3.优缺点分析 

    4.实例


    1.UML图 

    简单工厂模式解决的问题是如何去实例化一个合适的对象。

    简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

    2.简单工厂模式的伪代码

            基本上所有讲简单工厂模式的代码都会有下面这样的结构:

    1. public static Operation createOperate(string operate)
    2. {
    3. Operation oper = null;
    4. switch (operate)
    5. {
    6. case "+":
    7. {
    8. oper = new OperationAdd();
    9. break;
    10. }
    11. case "-":
    12. {
    13. oper = new OperationSub();
    14. break;
    15. }
    16. case "*":
    17. {
    18. oper = new OperationMul();
    19. break;
    20. }
    21. case "/":
    22. {
    23. oper = new OperationDiv();
    24. break;
    25. }
    26. }
    27. return oper;
    28. }

    3.优缺点分析 

    • 优点:客户端不需要修改代码。
    • 缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

    4.实例

            这个实例时我自己写的一个简单的计算器程序,只要计算加减乘除。要实现这样一个计算器,直觉就是:根据用户输入的不同的运算符选择不用的函数。没错,简单工厂模式,就是把这些功能函数分别分装到不同的类,然后通过Switch结构选择。

    关键代码如下:

    首先是为所有计算定义一个接口,接口只有一个方法:

    1. internal interface IOperator
    2. {
    3. public void Cal(double num1,double num2);
    4. }

    然后分别

    1. internal class Add:IOperator
    2. {
    3. public void Cal(double num1,double num2)
    4. {
    5. var ans = num1 + num2;
    6. Console.WriteLine($"{num1} + {num2}= {ans}");
    7. }
    8. }

    减 

    1. internal class Divide:IOperator
    2. {
    3. public void Cal(double num1, double num2)
    4. {
    5. var ans = num1 - num2;
    6. Console.WriteLine($"{num1} - {num2}= {ans}");
    7. }
    8. }

     乘

    1. internal class Mutiply:IOperator
    2. {
    3. public void Cal(double num1, double num2)
    4. {
    5. var ans = num1 * num2;
    6. Console.WriteLine($"{num1} * {num2}= {ans}");
    7. }
    8. }

     除

    1. internal class Sub:IOperator
    2. {
    3. public void Cal(double num1, double num2)
    4. {
    5. try
    6. {
    7. var ans = num1 / num2;
    8. Console.WriteLine($"{num1} / {num2}= {ans}");
    9. }
    10. catch (DivideByZeroException ex)
    11. {
    12. Console.WriteLine(ex.Message);
    13. }
    14. }
    15. }

    那么简单工厂就是根据选择返回不同的实例对象

    1. internal class CalCulateFactory
    2. {
    3. public static IOperator? Cal(int op)
    4. {
    5. return op switch
    6. {
    7. 1 => new Add(),
    8. 2 => new Sub(),
    9. 3 => new Mutiply(),
    10. 4 => new Divide(),
    11. _ => null,
    12. };
    13. }
    14. }

    最后整体代码如下:

    1. Helper.ShowTitle();
    2. Helper.ShowMenu();
    3. while (true)
    4. {
    5. Console.WriteLine("Please give two number:");
    6. var num1=Helper.GetInputNum();
    7. var num2=Helper.GetInputNum();
    8. var op = Helper.GetValidOption();
    9. //简单工厂模式
    10. var calculator=CalCulateFactory.Cal( op);
    11. calculator?.Cal(num1,num2);
    12. if (Helper.Quit())
    13. break;
    14. }
    15. Helper.Bye();

    代码完整链接:DesignPatternReview

  • 相关阅读:
    MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端框架搭建
    Linux: network: tcp_rmem/rmem_default
    在访问一个网页时弹出的浏览器窗口,如何用selenium 网页自动化解决?
    华为 OD 一面算法原题
    Vue列表渲染
    java-net-php-python-springboot博客系统计算机毕业设计程序
    Linux中nfs:failed: Operation not supported
    浅谈BIM技术在“智慧工地”建设中的应用
    Upscayl:开源AI图像放大增强工具 | AIGC实践
    uniapp列表进入动画
  • 原文地址:https://blog.csdn.net/q__y__L/article/details/126290407