设计模式 - 将枚举链接到类的实例

时间:2014-02-25 08:02:39

标签: c# design-patterns enums

我有一个类来控制文件在我的应用程序中的命名方式。它包括:

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属性,或者是工厂模式?

在我的应用程序的多个类中传递这两个insance有点“气味”,然后有一个CurrentFilenaming属性来保存当前的一个。或者也许这种(依赖注入)是要走的路?

2 个答案:

答案 0 :(得分:1)

如果你在Filenaming类上有2个实例,那么我建议你使用singleton + factory。

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 :(得分:1)

您要实现的目标称为Strategy pattern

  

我的问题是如何存储这两个实例的最佳方式,所以   DVEncoder在切换模式时可以正确拉出   Filenaming的实例

我建议您使用setter注入推送更改后的DVEncoder策略,而不是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不必在某个全局空间中查找以找到策略。所以你得到整齐的解耦代码,这也是可测试的。可测试,因为您甚至可以在单元测试时将TestFileNamingStrategy传递给DVEncoder

似乎我刚刚从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 否则,每当有人要求时,您就可以生成新策略。