2014-02-25 60 views
1

我有一個類控制文件在我的應用程序中的命名方式。它包括諸如:設計模式 - 將Enum鏈接到類的實例

public class Filenaming 
{ 
    public string Path{get;} 
    public string Extension{get;} 
    public int Identifier{get;} 
    public int SequenceNumber{get;} 
    //etc 
} 

在我的應用程序中有這個類的兩個實例。 DVEncoder類型可以保存一個或另一個,並根據它使用的實例爲其文件命名。

我決定使用enum來允許用戶在Filenaming的兩個實例之間切換。我的問題是如何存儲這兩個實例的最佳方式,以便DVEncoder在切換模式時可以提取正確的Filenaming實例。我應該使用靜態類,還是使用兩個Filenaming屬性或工廠模式的Singleton模式?

在我的應用程序中,有多種類型的「氣味」將這兩種感覺傳遞給多個類,然後有一個CurrentFilenaming屬性來保存當前的屬性。或者,也許這(依賴注入)是要走的路?

+0

命名行爲可以在運行時改變嗎? –

+0

是的,他們是由用戶設置 – Simon

回答

1

如果您對文件命名類恰好2個實例那麼我建議你使用一個單獨+工廠。

enum FileNamingOptions 
{ 
    Naming1, 
    Naming2 
} 

class FileNamingFactory 
{ 
    // Initialize the first and second instances (maybe in a static contructor) 
    private static Filenaming FileNaming1; 
    private static Filenaming FileNaming2; 

    public static Filenaming GetFileNaming(FileNamingOptions fileNaming) 
    { 
     if (fileNaming == FileNamingOptions.Naming1) 
     { 
      return FileNaming1; 
     } 
     else if (fileNaming == FileNamingOptions.Naming2) 
     { 
      return FileNaming2; 
     } 

     return null; 
    } 
} 

您的DVEncode可以有一個屬性,將使用GetFileNaming方法來確定使用哪個命名。

Filenaming CurrentNaming(FileNamingOptions currentOption) 
{ 
    return FileNamingFactory.GetFileNaming(currentOption); 
}   
1

你試圖實現的是所謂的Strategy pattern

我的問題是怎麼保存這兩種情況下,最好的辦法,所以 的DVEncoder,當切換模式,可以再拉正確 實例文件命名的

而不是DVEncoder拉它需要的類型,我建議你使用setter注入推動改變的FileNaming策略。

// Java代碼的 - 代替int爲策略的ID,你可以使用C#enum我猜

class DVEncoder{ 
    private FileNaming fileNamingStrategy; 
    public void setFileNamingStrategy(FileNaming fileNaming){ 
    this.fileNamingStrategy = fileNaming; 
    } 
} 

//This is how some other class will change the file naming strategy of DVEncoder 
dvEncoderInstance.setFileNamingStrategy(factory.getStrategy(nameOrIdOfStrategy)); 

現在它變成了對象,它保持DVEncoder注射合適的文件命名責任戰略和DVEncoder不必在全球某個空間查找戰略。所以你得到整潔的解耦代碼,這也是可測試的。可測試的,因爲你甚至可以通過一些TestFileNamingStrategyDVEncoder單元測試。

好像我剛纔刪除從DVEncoder耦合和問題仍然保持不變。但要回答我需要知道如何通知DVEncoder行爲發生變化。

我已經使用factory獲得戰略。我的工廠代碼與@sh_kamalh有所不同

class FileNamingStrategyFactory{ 
    public FileNaming getStrategy(int namingID){ //you can use enum here for strategyId 
     //constructs a new strategy based on ID 
    } 
} 

現在工廠如何構建策略的選擇取決於策略類本身是否保持某種狀態。如果他們沒有任何狀態,那麼你可以使用FlyWeight模式並返回一次生成的策略,如工廠示例中的@sh_kamalh 否則每次有人要求時都可以生成新策略。

+0

謝謝,我不認爲它是一個完全適合的戰略模式,我不是交換不同的實現,而是相同的類,但一些有用的信息在這裏。 – Simon

+0

那麼IMO正在交換'FileNaming'的不同實現。似乎它應該適合。 –