我有一个类来控制文件在我的应用程序中的命名方式。它包括:
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
属性来保存当前的一个。或者也许这种(依赖注入)是要走的路?
答案 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 否则,每当有人要求时,您就可以生成新策略。