switch语句是否适用于工厂方法?C#

Hca*_*tek 13 c# design-patterns interface factory-method

我想返回一个接口,并在switch语句中我想设置它.这是一个糟糕的设计吗?

private IResultEntity GetEntity(char? someType)
    {
        IResultEntity entity = null;

        switch (someType)
        {
            case 'L': //life
                entity = new LifeEntity();
                break;
            case 'P': //property
                entity = new PropertyEntity();
                break;
            case 'D': //disability
                entity = new DisabilityEntity();
                break;
            case 'C': //credit card
                entity = new CreditCardEntity();
                break;
        }

        return entity;
    }
Run Code Online (Sandbox Code Playgroud)

Rad*_*094 19

我通常不会介意工厂中的switch语句,只要我可以对我希望工厂提前创建的所有派生类进行分组和控制.

有时候,用户创建的插件可能想要将自己的类添加到该切换列表中,然后swich语句是不够的.

我找到了一些关于创建更强大/多功能工厂类的更多信息的良好来源

我通常采用的一种良好的中间方法是为每个工厂类保留一个静态的Dictionary <string,Type>.

人们可以使用某种方式"注册"他们自己的实现

Factories.TypeRegistration.StaticDictionary.Add("somekey",typeof(MyDerivedClass))
Run Code Online (Sandbox Code Playgroud)

(或者更好的是,使用注册方法并隐藏StaticDictionary)

然后,Factory可以通过在表中执行查找来轻松创建实例:

Activator.CreateInstance(Factories.TypeRegistration.StaticDictionary["somekey"]);
Run Code Online (Sandbox Code Playgroud)