工廠方法模式--實現計算器

前言:工廠方法模式名字上和前面第一個模式差不多,那就是簡單工廠。其實這個計算器的例子,在前面使用簡單工廠實現了一遍了。這次只是和使用相同的例子和工廠方法模式進行對比。在實現工廠方法模式的過程中發現了這個模式的優缺點!

優點:是每一個類或者功能的獨立性非常好。實現了可擴展,而不用修改其他的類。

缺點:每增加一個產品就需要增加一個產品工廠的類。

目錄

類圖:

代碼:

      form窗體:

運算:

      類:

      運算類

     工廠方法:

結果:


類圖:

代碼:

      form窗體:

//窗體通用聲明
 Operation oper =new Operation();//實例化運算類
        double result = 0;//結果
       //給按鈕賦值
        string NumberA = "";
        string NumberB = "";
        //區分AB的賦值標籤,如果是fals就給A賦值。
        //否則給B賦值。
        bool flage = false;
//數字按鈕
private void button1_Click(object sender, EventArgs e)
        {
            //判斷賦值對象
            if (flage)
            {
                NumberB += 1;
                textBox1.Text = NumberB;
            }
            else
            {
                NumberA += 1;
                textBox1.Text = NumberA;
            }
        }
//每一個數字按鈕的代碼,幾乎一摸一樣。除了代表的數字之外,
//其他的代碼完全一樣。所以就以1這個數字按鈕爲例就可以了。在這就不一一列舉了!

運算:

 

private void button12_Click(object sender, EventArgs e)
        {
            flage = true;//更改賦值標籤
                         //判斷是否計算
            IFactory operFactory = new AddFactory();//實例化加法工廠
            oper = operFactory.CreateOperation();//創建加法運算 
        }
 private void button11_Click(object sender, EventArgs e)
        {
            flage = true;//更改賦值標籤
            IFactory operFactory = new SubFactory();
            oper = operFactory.CreateOperation();
        }
 private void button14_Click(object sender, EventArgs e)
        {
            flage = true;//更改賦值標籤
            IFactory opertFactory = new MulFactory();
            oper = opertFactory.CreateOperation();
        }

 

 private void button14_Click(object sender, EventArgs e)
        {
            flage = true;//更改賦值標籤
            IFactory opertFactory = new MulFactory();
            oper = opertFactory.CreateOperation();
        }

 

private void button10_Click(object sender, EventArgs e)
        {
            
            //通過屬性,給A和B賦值。
            oper.NumberA = double.Parse(NumberA);
            oper.NumberB = double.Parse(NumberB);
            //計算結果
            result = oper.GetResult();
            //顯示結果
            textBox1.Text = result.ToString();
        }

      類:

      運算類

      

namespace 計算器
{
    /// <summary>
    /// 運算類
    /// </summary>
 public  class Operation
    {
        //兩個數
        private double _numberA = 0;
        private double _numberB = 0;
        /// <summary>
        /// 第一個數
        /// </summary>
        public double NumberA
        {
            get { return _numberA; }
            set { _numberA = value; }
        }
        /// <summary>
        /// 第二個數
        /// </summary>
        public double NumberB
        {
            get { return _numberB; }
            set { _numberB = value; }
        }
        /// <summary>
        /// 計算方法
        /// </summary>
        /// <returns></returns>
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }
}

 

namespace 計算器
{
    /// <summary>
    /// 加法類
    /// </summary>
 public   class OperationAdd:Operation
    {
        /// <summary>
        /// 加法
        /// </summary>
        /// <returns>計算結果</returns>
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;//返回結果
        }//end Getresult
    }
}

 

namespace 計算器
{
    /// <summary>
    /// 乘法類
    /// </summary>
public  class OperationMul:Operation
    {
        /// <summary>
        /// 乘法
        /// </summary>
        /// <returns>結果</returns>
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;

            return result;
        }//end GetResult
    }
}

 

namespace 計算器
{
public    class OpertionDiv:Operation
    {
        public override double GetResult()
        {
            double result = 0;
           
            if (NumberB==0)
            {
                result = 0;
            }
            else
            {
                result = NumberA / NumberB;
            }//end if
            return result;
        }//end GetResult
    }
}

 

namespace 計算器
{
    /// <summary>
    /// 減法
    /// </summary>
 public   class OperationSub:Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }//end GetResult
    }
}

     工廠方法:

namespace 計算器
{
    //工廠接口
 public   interface IFactory
    {
        Operation CreateOperation();//創建具體運算
    }
}
namespace 計算器
{
 public   class SubFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();//減法
        }
    }
}

 

namespace 計算器
{
    /// <summary>
    /// 加法工廠
    /// </summary>
  public  class AddFactory:IFactory
    {
        /// <summary>
        /// 創建加法運算
        /// </summary>
        /// <returns></returns>
        public Operation CreateOperation()
        {
            return new OperationAdd();//實例化加法類
        }
    }
}

namespace 計算器
{
  public  class MulFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationMul();//乘法
        }
    }
}
namespace 計算器
{
public    class DivFactory:IFactory
    {
        public Operation CreateOperation()
        {
            return new OpertionDiv();//除法
        }
    }
}

 

 

結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章