Один из вариантов - создать некоторый класс фабрики, затем вы можете создать экземпляр фабричного класса с помощью экземпляра класса, содержащего настройки, или из него.
Используя фабричный класс, вы можете получить TextFormatter, экземпляр возвращаемого форматера будет зависеть от предпочтений.
Вот очень простой пример, чтобы прояснить мой ответ с помощью некоторого кода. Это не супер фантазия и потенциально может использовать более изощренные шаблоны, но, надеюсь, это правильная отправная точка.
Определение интерфейса и некоторых форматеров
public interface IIdentifierFormatter
{
string FormatText(string text);
}
public class UnformattedIdenifierFormatter : IIdentifierFormatter
{
public string FormatText(string text)
{
return text;
}
}
public class CamelCaseIdenifierFormatter : IIdentifierFormatter
{
public string FormatText(string text)
{
// Camel case formatting here
return text;
}
}
public class ProperCaseIdenifierFormatter : IIdentifierFormatter
{
public string FormatText(string text)
{
// Proper case formatting here
return text;
}
}
Теперь пример класса предпочтений
enum NamingConvention
{
Unformatted,
CamelCase,
ProperCase
}
public class Preferences
{
public NamingConvention FieldNamingConvention { get; set; }
// .. Other settings
// Function to get the formatter depending on the FieldNamingConvention
public IIdentifierFormatter GetFieldNameFormatter()
{
switch (FieldNamingConvention)
{
case NamingConvention.Unformatted:
return new ProperCaseIdenifierFormatter();
case NamingConvention.CamelCase:
return new ProperCaseIdenifierFormatter();
case NamingConvention.ProperCase:
return new ProperCaseIdenifierFormatter();
default:
throw new Exception("Invalid or unsupported field naming convention.");
}
}
}
Использование кода
// Preferences loaded from some source,
// for the example I just initialized it here.
Preferences pref = new Preferences();
pref.FieldNamingConvention = NamingConvention.CamelCase;
// Get the formatter
IIdentifierFormatter formatter = pref.GetFieldNameFormatter();
string formatted = formatter.FormatText("the_name_to_format");