我正在对设计模式实现变体进行一些研究,我已经看到并阅读了这里实现的一些示例http://www.codeproject.com/Articles/37547/Exploring-Factory-Pattern和http://www.oodesign.com/factory-pattern.html。我关注的焦点是在没有反射的情况下实施工厂模式。所陈述的文章说我们需要注册的对象不是对我来说看起来很好和合乎逻辑的类,但是当看到实现时,我看到了对象的重复,例如在下面的代码中
// Factory pattern method to create the product
public IRoomType CreateProduct(RoomTypes Roomtype)
{
IRoomType room = null;
if (registeredProducts.Contains(Roomtype))
{
room = (IRoomType)registeredProducts[Roomtype];
room.createProduct();
}
if (room == null) { return room; }
else { return null; }
}
// implementation of concrete product
class NonACRoom : IRoomType
{
public static void RegisterProduct()
{
RoomFactory.Instance().RegisterProduct(new NonACRoom(), RoomTypes.NonAcRoom);
}
public void getDetails()
{
Console.WriteLine("I am an NON AC Room");
}
public IRoomType createProduct()
{
return new NonACRoom();
}
}
方法RegisterProduct用于自我注册,我们必须在创建工厂对象之前调用它,即在客户主类中的某些位置之前或在确保其调用的任何适用位置之前。下面是我们正在创建一个新产品,在上面的方法中,我们再次创建一个似乎没有意义的新产品。任何机构评论
答案 0 :(得分:0)
第一个创作用于为RegisterProduct
提供一些工作。可能这个对象的成本是可以忽略的。这是在初始化期间完成的,并不重要。
这个实例是必需的,因为在C#中你需要一个对象来调用createProduct
。这是因为您不能使用反射来存储对类型的引用,而不是对对象的引用。
答案 1 :(得分:0)
我过去做过类似的事情。这基本上就是我提出的(并且还取消了整个“Type”枚举):
public interface ICreator
{
IPart Create();
}
public interface IPart
{
// Part interface methods
}
// a sample creator/part
public PositionPartCreator : ICreator
{
public IPart Create() { return new PositionPart(); }
}
public PositionPart : IPart
{
// implementation
}
现在我们有了工厂本身:
public sealed class PartFactory
{
private Dictionary<Type, IPartCreator> creators_ = new Dictionary<Type, IPartCreator>();
// registration (note, we use the type system!)
public void RegisterCreator<T>(IPartCreator creator) where T : IPart
{
creators_[typeof(T)] = creator;
}
public T CreatePart<T>() where T: IPart
{
if(creators_.ContainsKey(typeof(T))
return creators_[typeof(T)].Create();
return default(T);
}
}
这基本上不需要“类型”枚举,并使事情变得非常容易:
PartFactory factory = new PartFactory();
factory.RegisterCreator<PositionPart>(new PositionPartCreator());
// all your other registrations
// ... later
IPart p = factory.CreatePart<PositionPart>();