简单工厂模式属于创建型设计模式。它会定义一个用于创建对象的接口,然后根据条件去实例化哪一个类型,通常被实例化的类型都有一个公共的父类或接口。它使一个类的实例化延迟到子类。

其结构图如下:

 

 

 Product是公共父类或者接口,ConcreteProduct为其子类。ConcreteCreator为创建类的工厂,提供了实例化对象的方法FactoryMethod(),其它对象在需要实例化的Product的时候,就不用自己创建,而是调用工厂中的FactoryMethod()方法来实例化。

应用场景:

例如我们要实现一个有加减乘除的计算器功能的程序。我们在用户输入之前是不可能知道我们应该实例化加法还是减法的,这个时候必须根据用户的输入去实例化具体对象,这个时候就可以使用该设计模式。

定义一个符号的父类

public class Operation
{   
public double NumA { get; set; }
  
public double NumB { get; set; }   public virtual double GetResult()   {     return 0;   } }

然后设计对应的加减乘除相关类

// 加法
class OperationAdd : Operation
{
    public override double GetResult()
    {
        return NumberA + NumberB;
    }
}

// 减法
class OperationSub : Operation
{
    public override double GetResult()
    {
        return NumberA - NumberB;
    }
}

// 乘法
class OperationMul : Operation
{
    public override double GetResult()
    {
        return NumberA * NumberB;
    }
}

// 除法
class OperationDiv : Operation
{
    public override double GetResult()
    {
        if (NumberB == 0)
            throw new Exception("除数不能为0。");
        return NumberA / NumberB;
    }
}

设计对应的创建工厂,并提供创建方法

public class OperationFactory
{
    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;
    }
}

这个时候就可以直接调用工厂来进行创建了

static void Main(string[] args)
{
  try
  {
    Console.Write("请输入数字A:");
    string strNumberA = Console.ReadLine();
    Console.Write("请选择运算符号(+、-、*、/):");
    string strOperate = Console.ReadLine();
    Console.Write("请输入数字B:");
    string strNumberB = Console.ReadLine();
    string strResult = "";

    Operation oper;
    oper = OperationFactory.createOperate(strOperate);
    oper.NumberA = Convert.ToDouble(strNumberA);
    oper.NumberB = Convert.ToDouble(strNumberB);
    strResult = oper.GetResult().ToString();

    Console.WriteLine("结果是:" + strResult);
  }
  catch (Exception ex)
  {
     Console.WriteLine("您的输入有错:" + ex.Message);
  }
}

 该模式将实例化对象的任务交给了工厂,用户只需要只要实例化的规则就可以了,而不用去管理具体实例化哪一个对象。但是该模式违反了开放封闭原则,如果我们要实例化新的对象,就必须修改工厂的方法。所以该模式通常用于实例化规则不经常改变的地方。

 posted on 2020-05-15 17:43  aohost  阅读(110)  评论(0)    收藏  举报