簡體   English   中英

是否有一種設計模式可以解決以多種不同方式創建相同產品的問題(需要類似管道的預創建步驟)

[英]Is there a design-pattern that addresses creation of the same product in multiple different ways (requiring pipeline-like pre-creation steps)

我目前正在從事一個機器學習項目,希望我的 Python 程序能夠將各種測量數據格式的測量數據處理/轉換為 PyTorch 兼容數據集 class。這實質上意味着我需要從這些測量中提取樣本和標簽這樣我就可以實例化我的數據集 class。

現在:我主要使用一個libraryA ,它提供了我加載和預處理數據所需的所有功能。 為了根據需要提取樣本和標簽,我必須遵循幾個處理步驟,這就是為什么我決定將該邏輯封裝在一個簡單的工廠 class 中。

我擔心的是:如果我需要處理libraryA不支持但另一個libraryB不支持的數據格式怎么辦。 然而,該libraryB在如何提取樣本和標簽方面有非常不同的方法,並且需要不同的處理步驟。

我最初的想法:使用抽象工廠或工廠方法來創建數據集 object 並讓子類決定如何做。 但是,盡管我沒有遵循 GoF 聲明的抽象工廠/工廠方法的意圖(我總是想要相同的單一產品),抽象方法的簽名將不匹配,因為庫需要非常不同的輸入。

我的問題:是否有合適的設計模式來標准化具有非常不同的預創建步驟的相同產品的創建?
或者我應該堅持使用與庫緊密耦合的具體簡單工廠(例如LibADatasetFactoryLibBDatasetFactory )?

是否有合適的設計模式來標准化具有非常不同的預創建步驟的相同產品的創建?

如果要創建相同的產品但使用不同的方法或策略,則可以使用策略模式。 因此,一種創建策略將使用libraryA ,而另一種策略將使用libraryB創建一個 object。正如 wiki 所說的Strategy pattern

在計算機編程中,策略模式(也稱為策略模式)是一種行為軟件設計模式,可以在運行時選擇算法。 代碼不是直接實現單個算法,而是接收運行時指令,說明在一系列算法中使用哪個算法

讓我通過 C# 舉個例子。

我們將通過各種庫創建Person

public class Person 
{
    public string Name { get; set; }
}

這是將使用各種庫的Person創建的抽象:

public interface IPersonCreationByLibrary 
{
    Person Create();
}

這是通過各種庫創建Person的抽象的具體實現:

public class PersonCreationByLibraryA : IPersonCreationByLibrary
{
    
    public Person Create()
    {
        // use here libraryA to create a person
        return new Person() { Name = "Person A"};
    }
}

和:

public class PersonCreationByLibraryB : IPersonCreationByLibrary
{

    public Person Create()
    {
        // use here libraryB to create a person
        return new Person() { Name = "Person B" };
    }
}

這是可用於創建Person的庫類型:

public enum Library
{
    A, 
    B
}

這是創建應該使用什么庫來創建Person的策略的工廠:

public class PersonCreationByLibraryFactory
{
    private Dictionary<Library, IPersonCreationByLibrary> _personByLibrary = 
    new () 
    {
        { Library.A, new PersonCreationByLibraryA() },
        { Library.B, new PersonCreationByLibraryB() }
    };

    public IPersonCreationByLibrary GetInstanceByLibrary(Library library) => 
        _personByLibrary[library];
}

    

這是顯示如何使用上述代碼的方法:

Person CreateByLibrary(Library library) 
{
    PersonCreationByLibraryFactory personCreationByLibraryFactory = 
        new PersonCreationByLibraryFactory();
    IPersonCreationByLibrary personCreationByLibrary =  
        personCreationByLibraryFactory.GetInstanceByLibrary(library);
    return personCreationByLibrary.Create();
}

上面的代碼可以這樣運行:

Person person = CreateByLibrary(Library.A); // OUTPUT: "Person A"

暫無
暫無

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

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