工厂模式:枚举参数与显式方法名称?

时间:2014-01-05 20:00:30

标签: enums factory-pattern

假设您有一个返回ILightBulb实例的工厂。实施工厂的两种方式(可能更多)如下:

选项1 - 传入枚举类型

enum LightBulbType
{
    Incandescent,
    Halogen,
    Led,
}

class ILightBulbFactory
{
    public ILightBulb Create(LightBulbType type)
    {
        switch (type)
        {
            case LightBulbType.Incandescent:
                return new IncandescentBulb();
            case LightBulbType.Halogen:
                return new HalogenBulb();
            case LightBulbType.Led:
                return new LedBulb();
        }
    }
}

选项2 - 显式方法名称

class ILightBulbFactory
{
    public ILightBulb CreateIncandescent()
    {
        return new IncandescentBulb();
    }

    public ILightBulb CreateHalogen()
    {
        return new HalogenBulb();
    }

    public ILightBulb CreateLed()
    {
        return new LedBulb();
    }
}

哪种方法最优选,为什么?

感谢。

2 个答案:

答案 0 :(得分:3)

在java中,你可以在枚举中解决它,从而确保如果你添加新的枚举,你的所有代码都将继续工作,而不是忘记在你的案例中添加语句。

enum LightBulbType
{
    Incandescent{

        @Override
        public ILightBulb getInstance() {
            return new IncandescentBulb();
        }

    },
    Halogen{

        @Override
        public ILightBulb getInstance() {
            return new HalogenBulb();
        }

    },
    Led{

        @Override
        public ILightBulb getInstance() {
            return new LedBulb();
        }

    };

    public abstract ILightBulb getInstance();
}

class ILightBulbFactory
{
    public ILightBulb Create(LightBulbType type)
    {
       return type.getInstance();
    }
}

答案 1 :(得分:0)

c#的等效项为

public sealed class LightBulbType
{
    public static readonly LightBulbType Incandescent = new 
           LightBulbType("Incandescent", new IncandescentBulb());
    public static readonly LightBulbType Halogen = new 
           LightBulbType("Halogen", new HalogenBulb());
    public static readonly LightBulbType LedBulb = new LightBulbType("Led", 
           new LedBulb());

    public static IEnumerable<LightBulbType> Values
    {
        get
        {
            yield return Incandescent;
            yield return Halogen;
            yield return LedBulb;
        }
    }

    private string Name { get; set; }

    private ILightBulb Instance { get;}


    private LightBulbType(string name, ILightBulb instance)
    {
        this.Name = name;
        this.Instance = instance;
    }

    public override string ToString() => Name;

    public ILightBulb GetInstance()
    {
        return Instance;
    }
}

public interface ILightBulb
{
}

public class IncandescentBulb : ILightBulb
{
}

public class HalogenBulb : ILightBulb
{
}

public class LedBulb : ILightBulb
{
}

public static class LightBulbFactory
{
    public static ILightBulb Create(LightBulbType type)
    {
        return type.GetInstance();
    }
}

For call

ILightBulb halogenBulb = new HalogenBulb();
ILightBulb incandescentBulb = new IncandescentBulb();
ILightBulb ledBulb = new LedBulb();

or 

ILightBulb halo = LightBulbFactory.Create(LightBulbType.Halogen);
ILightBulb inca = LightBulbFactory.Create(LightBulbType.Incandescent);
ILightBulb led = LightBulbFactory.Create(LightBulbType.LedBulb);