C#設計模式--工廠模式(建立型模式)

一.簡單工廠模式(UML類圖):設計模式

核心類代碼:框架

public class Calc
{
    public double NumberA { get; set; }
    public double NumberB { get; set; }
    public virtual double GetResult()
    {
        double result = 0;
        return result;
    }
}
用於返回計算結果
public class Add : Calc
{
    public override double GetResult()
    {
        return NumberA + NumberB;
    }
}
四則運算類
public class CalcFactory
{
    public static Calc CalcValue(string operate)
    {
        Calc calc = null;
        switch (operate)
        {
            case "+":
                calc = new Add();
                break;
            case "-":
                calc = new Sub();
                break;
            case "*":
                calc = new Mul();
                break;
            case "/":
                calc = new Div();
                break;
        }
        return calc;
    }      
}
用於判斷計算的工廠

客戶端進行調用:ide

static void Main(string[] args)
{
    Calc calc = CalcFactory.CalcValue("+");
    calc.NumberA = 5;
    calc.NumberB = 9;
    Console.WriteLine(calc.GetResult());
    Console.ReadKey();
}

二.工廠方法模式(UML類圖):測試

   工廠方法模式(Factory Method)是一種建立型的設計模式,在該模式中父類決定實例的生成方式。可是不決定它要生成的具體的類,具體的處理是交給子類完成的,這樣將生成實例的框架和負責生成實例的類解耦。this

核心類代碼:spa

public interface IFactory
{
    Calc createCalc();
}
工廠接口,建立計算
public class AddFactory:IFactory
{
    public Calc createCalc()
    {
        return new Add();
    }
}
加法工廠

客戶端進行進行調用:設計

static void Main(string[] args)
{
    IFactory fact = new AddFactory();
    Calc calc= fact.createCalc();
    calc.NumberA = 2;
    calc.NumberB = 2;
    Console.WriteLine(calc.GetResult());
    Console.ReadKey();
}

三.工廠方法模式(一個工廠一個產品): code

  從簡單入手,下面經過製做身份證IDCard來了解工廠模式:blog

  • 產品類(Product):
    • 在該類中僅僅聲明瞭一個抽象方法use(),定義了任意產品均可以use的方法,即定義了生成的實例所持有的接口方法。
public abstract class Product
{
    public abstract void Use();
}
產品類
  • 工廠類(Factory):
    • 該工廠是生產Product類,負責生成產品Product,可是具體處理交由具體建立者。對於使用生成實例的專用方法createProduct建立實例,而不用new關鍵字來生成,這樣作的好處是能夠防止,父類與其餘類耦合
      • create:建立產品
      • createProduct(抽象方法):頂層負責調用,底層負責實現
      • registerProduct(抽象方法):註冊產品。
public abstract class Factory
{
    public Product create(string name)
    {
        Product product = createProduct(name);
        registerProduct(product);
        return product;
    }
    protected abstract Product createProduct(string name);
    protected abstract void registerProduct(Product product);      
}
工廠類
  • 具體產品類:
    • 身份證IDCard屬於一個具體的產品,繼承自Product,是具體的產品,來實現產品抽象類的內容
      • 具體的由誰製做「身份證IDCard」
      • 具體的由誰使用身份證IDCard」
      • 提供一個獲取這個具體的Name

 

public class IDCard:Product
{
    string name;
    public IDCard(string name)
    {
        Console.WriteLine("製做卡片:"+name);
            this.name=name;
    }
    public override void Use()
    {
        Console.WriteLine(name+"使用卡片");
    }
    public string getName()
    {
        return name;
    }
}
具體產品類IDCard
  • 具體的工廠類(什麼工廠):
    • 爲了方便理解,因此這個工廠就生產單一的產品,「身份證IDCard」 
      • 在頂層直接調用生產的方法就能夠了,具體生產由具體的底層實現就能夠了。
      • 將建立的產品信息註冊到ArrayList中,返回這個註冊信息就知道誰建立的,誰在使用
public class IDCardFactory:Factory
{
    ArrayList list = new ArrayList();
    protected override Product createProduct(string name)
    {
        return new IDCard(name);
    }
    protected override void registerProduct(Product product)
    {
        IDCard card = (IDCard)product;
        list.Add(card.getName());
    }
    public ArrayList getName()
    {
        return list;
    }
}
具體工廠模式(單一產品)

四.工廠方法模式調用測試:繼承

下面實際調用測試一下:

static void Main(string[] args)
{       
    Factory factory = new IDCardFactory();
    Product card1 = factory.create("小明");
    Product card2 = factory.create("小紅");
    Product card3 = factory.create("小剛");
    card1.use();
    card2.use();
    card3.use();   
    Console.ReadKey();
}

  輸出信息:

    • 製做ID卡小明
    • 製做ID卡小紅
    • 製做ID卡小剛
    • 使用ID卡小明
    • 使用ID卡小紅
    • 使用ID卡小剛
相關文章
相關標籤/搜索