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