1. 程式人生 > >設計模式(C#)——簡單工廠模式

設計模式(C#)——簡單工廠模式

推薦閱讀:

      工廠模式主要是為建立物件提供過渡介面,以便將建立物件的具體過程遮蔽隔離起來。通俗來說,你只關心怎麼用,不用關心怎麼做。

工廠模式可以分為三類:

1.簡單工廠模式(Simple Factory)
2.工廠方法模式(Factory Method)
3.抽象工廠模式(Abstract Factory)

      掌握簡單工廠模式是我們學習工廠模式最基礎的條件,只有理解了簡單的,才能更深入的學習。對於剛接觸設計模式的朋友來說,看前一篇單例模式的朋友覺得挺輕鬆,但今天要將的工廠模式可能就不是特別容易消化了。為了讓大家更深刻的理解這個模式,我將給大家展現出一個有趣的學習過程。

簡單工廠模式(Simple Factory Pattern)

簡單工廠模式又稱靜態工廠方法模式(Static Factory Method)。
簡單工廠模式要素:

①抽象基類:類中定義抽象一些方法,用以在子類中實現,通俗的說就是抽象產品。例:運算類my_opterator
②繼承自抽象基類的子類:實現基類中的抽象方法,通俗的說就是具體的產品。例:加法類ADDopterator,乘法類MULopertator等
③工廠類:用以例項化物件。例如:factory

下面舉個例子用類圖來介紹一下上面幾個要素之間的關係吧。
實現算術運算:
在這裡插入圖片描述
      名稱空間簡單工廠模式中包含抽象運算基類my_opterator、四個具體運算類、工廠類factory。本案例將向大家展示如何使用簡單工廠模式來進行不同的算術運算。
程式碼實現過程:
1.建立抽象類my_opterator

abstract class my_opterator                 //演算法類父類
{
    private double m_a, m_b;
    public double A                        //A屬性
    {
        get { return m_a; }
        set { m_a = value; }
    }
    public double B                       //B屬性
    {
        get { return m_b; }
        set { m_b = value; }
    }
    abstract public double getresult();     //抽象方法,獲得結果
}

2.建立繼承抽象類的子類。

class ADDopterator : my_opterator           //加法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A + B;
    }
}
 
class SUBoperator : my_opterator            //減法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A - B;
    }
}
 
class MULopertator : my_opterator           //乘法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A * B;
    }
}
 
class DIVoperator : my_opterator            //除法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A / B;
    }
}

3.建立一個工廠,生成基於給定資訊的實體類的物件

class factory                                       //簡單工廠類
{
    private my_opterator m_opt;
    public my_opterator createclass(string opt, double a, double b)
    {
        switch(opt)
        {
            case "+":
                {
                    m_opt = new ADDopterator();
                    break;
                }
            case "-":
                {
                    m_opt = new SUBoperator();
                    break;
                }
            case "*":
                {
                    m_opt = new MULopertator();
                    break;
                }
            case "/":
                {
                    m_opt = new DIVoperator();
                    break;
                }
        }
        m_opt.A = a;
        m_opt.B = b;
        return m_opt;
    }
}

4.使用該工廠,通過傳遞型別資訊來獲取實體類的物件。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace 簡單工廠模式
{
    class Program
    {
        static void Main(string[] args)
        {
            string A, B;
            string opt;
            Console.WriteLine("請輸入數字A:");
            A = Console.ReadLine();
            Console.WriteLine("請輸入運算子:");
            opt = Console.ReadLine();
            Console.WriteLine("請輸入數字B:");
            B = Console.ReadLine();
 
            my_opterator my_opt;                    //演算法類父類
            factory fa = new factory();             //簡單工廠類
            my_opt = fa.createclass(opt, Convert.ToDouble(A), Convert.ToDouble(B));     //呼叫生產演算法方法
            Console.WriteLine(my_opt.getresult());
        }
    }
}

      從上面程式碼可以發現:系統難以擴充套件,一旦新增新產品就不得不修改簡單工廠方法,這樣就會造成簡單工廠的實現邏輯過於複雜。
整合後的程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace 簡單工廠模式
{
    class Program
    {
        static void Main(string[] args)
        {
            string A, B;
            string opt;
            Console.WriteLine("請輸入數字A:");
            A = Console.ReadLine();
            Console.WriteLine("請輸入運算子:");
            opt = Console.ReadLine();
            Console.WriteLine("請輸入數字B:");
            B = Console.ReadLine();
 
            my_opterator my_opt;                    //演算法類父類
            factory fa = new factory();             //簡單工廠類
            my_opt = fa.createclass(opt, Convert.ToDouble(A), Convert.ToDouble(B));     //呼叫生產演算法方法
            Console.WriteLine(my_opt.getresult());
        }
    }
}
 
class factory                                       //簡單工廠類
{
    private my_opterator m_opt;
    public my_opterator createclass(string opt, double a, double b)
    {
        switch(opt)
        {
            case "+":
                {
                    m_opt = new ADDopterator();
                    break;
                }
            case "-":
                {
                    m_opt = new SUBoperator();
                    break;
                }
            case "*":
                {
                    m_opt = new MULopertator();
                    break;
                }
            case "/":
                {
                    m_opt = new DIVoperator();
                    break;
                }
        }
        m_opt.A = a;
        m_opt.B = b;
        return m_opt;
    }
}
 
abstract class my_opterator                 //演算法類父類
{
    private double m_a, m_b;
    public double A                        //A屬性
    {
        get { return m_a; }
        set { m_a = value; }
    }
    public double B                       //B屬性
    {
        get { return m_b; }
        set { m_b = value; }
    }
    abstract public double getresult();     //抽象方法,獲得結果
}
 
class ADDopterator : my_opterator           //加法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A + B;
    }
}
 
class SUBoperator : my_opterator            //減法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A - B;
    }
}
 
class MULopertator : my_opterator           //乘法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A * B;
    }
}
 
class DIVoperator : my_opterator            //除法類
{
    public override double getresult()      //抽象方法的實現
    {
        return A / B;
    }
}