簡體   English   中英

抽象工廠模式

[英]Abstract Factory pattern

這是關於抽象工廠模式。

我們知道有兩種方法可以使用,即

  1. 直接創建具體類的實例或
  2. 提供一個接口,通過它我們可以訪問具體的類

如果我使用選項1,那么有人可以說出優勢/劣勢,那么這些是可能發生的問題,反之亦然,如果可能的話,使用實時示例。

提前致謝...

直接創建對象肯定很容易 (C#中的示例):

public class Consumer()
{
    public void DoStuff()
    {
        var f = new Foo()
        f.DoIt("bar");
    }
}

雖然容易,但它會導致緊耦合,因為您無法獨立於消費者而改變實例。

雖然更復雜 ,但使用抽象工廠的消費者松散耦合

public class Consumer()
{
    private readonly IFooFactory fooFactory;

    public Consumer(IFooFactory fooFactory)
    {
        if (fooFactory == null)
        {
            throw new ArgumentNullException("fooFactory");
        }

        this.fooFactory = fooFactory;
    }

    public void DoStuff()
    {
        var f = this.fooFactory.Create();
        f.DoIt("bar");
    }
}

這看起來比第一個版本更復雜,但現在您可以獨立於Consumer改變f的實現。

您不僅可以更改實施 ,還可以在不同的消費者之間重用共享實例。

在許多情況下,您不需要抽象工廠來啟用松耦合。 通常,您可以直接將依賴項注入到使用者中,而不是訴諸於額外的間接級別。

如果你有一個沒有子類的具體類,並且你確信它永遠不會是,那么你可以像在你的選項1中那樣實例化它 - 為此它不需要工廠。

如果你有一個帶有幾個具體子類的接口/抽象類,並且你希望能夠改變實現而不將客戶端綁定到其中任何一個 - 這就是你使用工廠 (或依賴注入 )時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM