Я думаю, что ваше решение отлично. Организм состоит из пищевого поведения, где каждое пищевое поведение является неизменным объектом, который реализует это поведение. Поскольку поведение обычно реализуется как классы, ваши синглтоны выглядят здесь как вполне допустимые.
Единственное, о чем я могу думать, это то, что публично видимый класс для поведения Myrmecophagy может быть ненужным. Вы можете просто поместить класс в FeedingBehavior, сделать его закрытым и открыть только статическое общедоступное поле только для чтения, содержащее синглтон.
Если вам интересно, у меня есть реализация RFC3454 в одном из моих проектов. RFC описывает структуру для подготовки строк в соответствии с различными профилями. Поэтому я создал абстрактный класс StringPreparer, который предоставляет несколько стандартных профилей в виде одноэлементных экземпляров или которые, в качестве альтернативы, могут быть расширены пользователями для реализации пользовательских профилей:
public abstract class StringPreparer
{
public static readonly StringPreparer Domain = new DomainStringPreparer();
public static readonly StringPreparer Node = new NodeStringPreparer();
public static readonly StringPreparer Resource = new ResourceStringPreparer();
public static readonly StringPreparer Sasl = new SaslStringPreparer();
public static readonly StringPreparer Trace = new TraceStringPreparer();
protected StringPreparer()
{
}
public abstract bool TryPrepare(
string text, int offset, int count, out string result);
...
private class DomainStringPreparer : StringPreparer
{
public override bool TryPrepare(
string text, int offset, int count, out string result)
{
...
}
}
private class NodeStringPreparer : StringPreparer
{
...