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

Enums 工厂模式:枚举参数与显式方法名称?,enums,factory-pattern,Enums,Factory Pattern,假设您有一个返回ILightBulb实例的工厂。工厂实施的两种方式(可能更多)如下: 选项1-传入枚举类型 选项2-显式方法名称 哪种方法最可取,为什么 谢谢。在java中,您可以在枚举中解决它,从而确保如果添加新的枚举,所有代码都将保持工作状态,而不是忘记向案例中添加语句 enum LightBulbType { Incandescent{ @Override public ILightBulb getInstance() {

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

选项1-传入枚举类型 选项2-显式方法名称 哪种方法最可取,为什么


谢谢。

在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();
    }
}
c#的等价物是

公共密封类灯泡类型
{
公共静态只读灯泡类型白炽灯=新
灯泡类型(“白炽灯”,新白炽灯泡());
公共静态只读LightBulbType卤素=新
灯泡类型(“卤素”,新的卤素灯泡());
公共静态只读灯泡类型Led灯泡=新灯泡类型(“Led”,
新LED灯泡());
公共静态IEnumerable值
{
得到
{
回程白炽灯;
回收卤素;
成品率;
}
}
私有字符串名称{get;set;}
私有ILightBulb实例{get;}
private LightBulbType(字符串名称,ILightBulb实例)
{
this.Name=Name;
this.Instance=Instance;
}
公共重写字符串ToString()=>名称;
公共ILightBulb GetInstance()
{
返回实例;
}
}
公共接口ILightBulb
{
}
公共级白炽灯泡:ILightBulb
{
}
公共级卤素灯泡:iLightBull
{
}
公共级LED灯泡:iLightBull
{
}
公共静态类灯塔工厂
{
公共静态ILightBulb创建(LightBulbType类型)
{
返回类型:GetInstance();
}
}
待命
ILightBull HalogenBull=新的HalogenBull();
i灯泡白炽灯泡=新白炽灯泡();
ILightBulb LED灯泡=新的LED灯泡();
或
ILightBulb halo=LightBulbFactory.Create(LightBulbType.卤素);
ILightBulb inca=灯泡工厂.Create(灯泡类型.白炽灯);
ILightBulb led=LightBulbFactory.Create(LightBulbType.ledbuble);

方法开头的
I
是一些人使用的接口的命名约定。我不认为将类命名为ILightBulbFactory有什么意义。另外,这两种方法都不好,并且与仅使用构造函数相比没有任何优势(除非您拥有所述类型的真正子类型)。相反,传递一个实际的行为标准,根据该标准创建对象,并根据该标准返回对象。如果factory方法接受该类型或显式调用基于该类型的方法,那么就失去了重点。我认为我不需要澄清白炽灯、卤素灯和Led是“真正的子类型”这一事实。也许我不明白你的意思。此外,我至少可以想到工厂方法过度使用构造函数的一个很好的理由——实例化发生在一个地方。因此,如果您的代码库中到处都是“new ledbull()”,并且希望将其更改为使用“fluorescentbull()”,那么您只能在工厂中进行。但我认为这是离题的。从这句话开始你就失去了我:“相反,通过一个实际的行为标准……”。也许你可以澄清一下。使用任何具有重构功能的现代IDE,更改代码“new-ledbull同样容易。在工厂中,您需要根据您的
ilightbull
成员的功能对他们进行分类。当您想要多态实例化时,您不想显式地说“ledbull”,原因与您不想使用
is
instanceof
(在C#或Java中)(它不是真正的多态)完全相同。我说的是-
公共照明灯泡创建(需要双亮度)
创建特定类型的灯泡与该类型的实际属性有关。这太棒了!这肯定回答了我问题中的“为什么”部分,我喜欢在switch语句或方法名称上使用多态性——真正的OO。谢谢。这将是我未来使用的首选模式。很高兴我能提供帮助,这是我最喜欢的模式,如果你想在这方面做更多的研究,它被称为战略模式;)@Pienterekaak如果这是一种策略模式,那么为什么要调用ILightBulbFactory类?为什么是工厂?
class ILightBulbFactory
{
    public ILightBulb CreateIncandescent()
    {
        return new IncandescentBulb();
    }

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

    public ILightBulb CreateLed()
    {
        return new LedBulb();
    }
}
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();
    }
}
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);