簡體   English   中英

為什么需要FactorySupplier?

[英]Why do I need a FactorySupplier?

在我正在處理的項目中(不是我的項目,只是在處理它),有很多這樣的結構:

project.priv.logic.MyServiceImpl.java
project.priv.service.MyServiceFactoryImpl.java

project.pub.logic.MyServiceIF.java
project.pub.service.MyServiceFactoryIF.java
project.pub.service.MyServiceFactorySupplier.java

服務的調用方式如下:

MyServiceFactorySupplier.getMyServiceFactory().getMyService()

據我所知,工廠用來隱藏實施MyServiceImpl如果位置或內容MyServiceImpl變化。 但是,為什么我的工廠(供應商)還有另一個工廠? 我認為我的工廠和FactorySupplier更換的可能性大致相等。 另外,我還沒有發現動態創建創建的工廠的一種情況(我認為在抽象工廠模式中就是這種情況),但是只返回MyServiceFactoryImpl.getInstance() 實施FactorySupplier是慣例嗎? 有什么好處?

假設您具有實現MyServiceIF的類的層次結構。

假設您具有匹配的工廠類層次結構,以在原始層次結構中創建每個實例。

在這種情況下, MyServiceFactorySupplier可以具有可用工廠的注冊表,並且您可以調用getMyServiceFactory(parameter) ,在該參數中,參數確定將實例化哪個工廠(因此將由該工廠創建該類的實例)。

我不知道這是否是您項目中的用例,但這是有效的用例。

這是我的意思的代碼示例:

public class MyServiceImpl implements MyServiceIF 
{
....
}

public class MyServiceImpl2 implements MyServiceIF
{
....
}

public class MyServiceFactoryImpl implements MyServiceFactoryIF
{
    ....
    public MyServiceIF getMyService ()
    {
        return new MyServiceImpl ();
    }
    ....
}

public class MyServiceFactoryImpl2 implements MyServiceFactoryIF
{
    ....
    public MyServiceIF getMyService ()
    {
        return new MyServiceImpl2 ();
    }
    ....
}

public class MyServiceFactorySupplier
{
    ....
    public static MyServiceFactoryIF getMyServiceFactory()
    {
        return new MyServiceFactoryImpl (); // default factory
    }

    public static MyServiceFactoryIF getMyServiceFactory(String type)
    {
        Class serviceClass = _registry.get(type);
        if (serviceClass != null) {
            return serviceClass.newInstance ();
        } else {
            return getMyServiceFactory(); // default factory
        }
    }
    ....
}

我有一個由工廠層次結構實例化的相關類層次結構。 雖然我沒有FactorySupplier類,但是在工廠層次結構的基類中有一個靜態方法BaseFactory.getInstance(parameter) ,該方法返回一個依賴於傳遞的參數的工廠實例。

我可以想到幾個例子(有些人為的),這種模式可能有用。 通常,您有兩種或多種服務實現方式,例如

  • 一種用於生產/一種用於測試
  • 一種用於訪問數據庫的服務的實現,另一種用於訪問文件存儲的實現
  • 針對不同語言環境的不同實現(翻譯,日期和數字的格式等)
  • 您要訪問的每種數據庫的一種實現

在以上每個示例中,在應用程序啟動時都需要為FactorySupplier進行初始化,例如,使用語言環境或數據庫類型對FactorySupplier進行參數設置,並根據這些參數生成相應的工廠。

如果我理解正確,則您的應用程序中沒有任何此類代碼,並且FactorySupplier始終返回相同類型的工廠。

也許這樣做是為了對尚不需要的可擴展性進行編程,但是恕我直言,這看起來像是在猜測將來某個時候應用程序可能需要什么,而不是有意識地選擇體系結構。

暫無
暫無

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

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