简单工厂模式

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

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

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

目录

1.UML图 

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

3.优缺点分析 

4.实例


1.UML图 

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

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

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

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

public static Operation createOperate(string operate)
{
    Operation oper = null;
    switch (operate)
    {
        case "+":
            {
                oper = new OperationAdd();
                break;
            }
        case "-":
            {
                oper = new OperationSub();
                break;
            }
        case "*":
            {
                oper = new OperationMul();
                break;
            }
        case "/":
            {
                oper = new OperationDiv();
                break;
            }
    }
    return oper;
}

3.优缺点分析 

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

4.实例

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

关键代码如下:

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

    internal interface IOperator
    {
        public void Cal(double num1,double num2);
    }

然后分别

    internal class Add:IOperator
    {
        public void Cal(double num1,double num2)
        {
            var ans = num1 + num2;
            Console.WriteLine($"{num1} + {num2}= {ans}");
        }
    }

减 

    internal class Divide:IOperator
    {
        public void Cal(double num1, double num2)
        {
            var ans = num1 - num2;
            Console.WriteLine($"{num1} - {num2}= {ans}");
        }
    }

 乘

    internal class Mutiply:IOperator
    {
        public void Cal(double num1, double num2)
        {
            var ans = num1 * num2;
            Console.WriteLine($"{num1} * {num2}= {ans}");
        }
    }

 除

    internal class Sub:IOperator
    {
        public  void Cal(double num1, double num2)
        {
            try
            {
                var ans = num1 / num2;
                Console.WriteLine($"{num1} / {num2}= {ans}");
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine(ex.Message);
            }

        }
    }

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

    internal class CalCulateFactory
    {
        public static IOperator? Cal(int op)
        {
            return op switch
            {
                1 => new Add(),
                2 => new Sub(),
                3 => new Mutiply(),
                4 => new Divide(),
                _ => null,
            };
        }
    }

最后整体代码如下:

Helper.ShowTitle();
Helper.ShowMenu();

while (true)
{
    Console.WriteLine("Please give two number:");
    var num1=Helper.GetInputNum();
    var num2=Helper.GetInputNum();
    var op = Helper.GetValidOption();
    //简单工厂模式
    var calculator=CalCulateFactory.Cal( op);   
    calculator?.Cal(num1,num2);
    if (Helper.Quit())
        break;
}
Helper.Bye();

代码完整链接:DesignPatternReview

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值