站点图标 久久日记本

简单工厂模式

1.工厂模式.

  实例:计算器

  创建方法:

首先是运算类,它有两个Number属性,用于计算计算器的前后数;

然后有一个虚方法GetResult,用于得到结果;

//运算类
{
    两个Number属性{get;set;} //主要用于计算前后数,NumA,NumB
    虚方法GetResult//用于得到结果
}

把加减乘除都写成子运算类的子类,继承它,重写了GetResult()方法,

运算类子类:运算类//运算类子类  继承  运算类
 {
    //重写GetRsult方法
    运算类子类1//这里 如果不写  就为 private
    {
        public overrive 运算方法{};
        //切记这里是public,上面一行不要加public,不加就是默认private.  加了之后会报错.访问级别导致不知道要访问overrive之前的还是现在的方法
    }
     运算类子类2
    {
        public overrive 运算方法{};
    }
    运算类子类3
    {
        public overrive 运算方法{};
    }
}

这样如果要修改任何一个算法,都不需要提供其它算法的代码了.

让计算器指导我是希望用哪一种算法:

运算类工厂
{
    public static 运算类 CreateFunction(string 传入参数)//切记前面的static不能忘了,返回值类型为  运算类
    {
        运算类 my=null;
        switch(传入参数)
        {
           case "+":
               my=new 运算子类1();
               break;
           case "-":
               my=new 运算子类2();
               break;
           case "*":
               my=new 运算子类3();
               break;
        }
           return my;//返回  运算类  类型
    }

}

在Program中调用,只要输入运算符号,用工厂实例化合适的对象,通过多台,返回父类的方式实现计算器的结果.

//Program.cs

运算类 mynew;
mynew=运算类工厂.CreateFunction("传入的值");
mynew.NumA=数字A;
mynew.Numb=数字B;
Console.WriteLine(mynew.GetResult().toString());

这样 需要增加各种复杂运算,比如平方根,立方根,自然对数,正弦余弦等,只要增加相应的运算子类就可以了.

完整代码:

/**//// <summary>
/// 运算类
/// </summary>
class Operation
{
    private double _numberA = 0;
    private double _numberB = 0;

    /**//// <summary>
    /// 数字A
    /// </summary>
    public double NumberA
    {
        get{ return _numberA; }
        set{ _numberA = value;}
    }

    /**//// <summary>
    /// 数字B
    /// </summary>
    public double NumberB
    {
        get{ return _numberB; }
        set{ _numberB = value; }
    }

    /**//// <summary>
    /// 得到运算结果
    /// </summary>
    /// <returns></returns>
    public virtual double GetResult()
    {
        double result = 0; 
        return result;
    }


}

//运算类View Code
/**//// <summary>
/// 加法类
/// </summary>
class OperationAdd : Operation
{
    public override double GetResult()
    {
        double result = 0; 
        result = NumberA + NumberB;
        return result;
    }
}

/**//// <summary>
/// 减法类
/// </summary>
class OperationSub : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA - NumberB;
        return result;
    }
}

/**//// <summary>
/// 乘法类
/// </summary>
class OperationMul : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA * NumberB;
        return result;
    }
}

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

//运算子类 View Code
/**//// <summary>
/// 运算类工厂
/// </summary>
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;
    }
}

//运算类工厂 View Code
Operation oper;
oper = OperationFactory.createOperate("+");
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();

工厂模式和策略模式的区别:

策略,从字面就好理解,意思是一种决策,所以通常它都适用于一些商务逻辑或算法等类的选择上,因此只要是一些涉及到商务逻辑(都是继承同一个抽象类的子类)的选择时,都可以考虑用策略模式。从这个角度讲,策略模式在面向对象编程中的应用可说是无处不在,它是最最常见的模式。

而简单工厂模式,主要解决的是类的实例化问题,把实例化的决策从客户端转移到工厂类当中,让客户端只是输入一个比如“字符串”这样的标识就可以通过简单工厂生成一个相应的类实例。这个模式是解决类的创建问题。

它们两者并不矛盾,因此不要有非此即彼的想法。事实上把它们结合使用会更有意义。

参考:大话设计模式

退出移动版