我对工厂方法模式的理解是(纠正我,如果我错了)
工厂方式模式
“工厂方法允许客户将产品创建(实例创建)委托给子类”。
有两种情况我们可以创建工厂方法模式。
(i) 当客户端仅限于产品(实例)创建时。
(ii) 有多种产品可供使用。但是决定制作哪个产品实例 需要退货。
如果要创建抽象方法模式
示例:
public enum ORMChoice
{
L2SQL,
EFM,
LS,
Sonic
}
//Abstract Product
public interface IProduct
{
void ProductTaken();
}
//Concrete Product
public class LinqtoSql : IProduct
{
public void ProductTaken()
{
Console.WriteLine("OR Mapping Taken:LinqtoSql");
}
}
//concrete product
public class Subsonic : IProduct
{
public void ProductTaken()
{
Console.WriteLine("OR Mapping Taken:Subsonic");
}
}
//concrete product
public class EntityFramework : IProduct
{
public void ProductTaken()
{
Console.WriteLine("OR Mapping Taken:EntityFramework");
}
}
//concrete product
public class LightSpeed : IProduct
{
public void ProductTaken()
{
Console.WriteLine("OR Mapping Taken :LightSpeed");
}
}
public class Creator
{
//Factory Method
public IProduct ReturnORTool(ORMChoice choice)
{
switch (choice)
{
case ORMChoice.EFM:return new EntityFramework();
break;
case ORMChoice.L2SQL:return new LinqtoSql();
break;
case ORMChoice.LS:return new LightSpeed();
break;
case ORMChoice.Sonic:return new Subsonic();
break;
default: return null;
}
}
}
**Client**
Button_Click()
{
Creator c = new Creator();
IProduct p = c.ReturnORTool(ORMChoice.L2SQL);
p.ProductTaken();
}
我对工厂方法的理解是否正确?
答案 0 :(得分:1)
你所拥有的实际上更多的是Abstract Factory Pattern,只有你工厂(Creator
)不是抽象的。因子方法模式对子类化特别有用:
class A {
public:
A() : m_Member( GetMember() )
{
}
protected:
virtual ISomeInterface * GetMember() { // default impl here }
private:
ISomeInterface * m_Member;
}
现在A
的子类可以覆盖GetMember
,以使超类使用ISomeInterface
的特定实现。
答案 1 :(得分:0)
定义用于创建的界面 对象,但让子类决定 要实例化的类。厂 方法让一个类推迟 实例化到子类。
更多细节和示例:http://www.dofactory.com/Patterns/PatternFactory.aspx
答案 2 :(得分:-1)
是的,这似乎是实现这一目标的正确方法,尽管非常简单。实际上,您可能想要考虑各种参数的传入,这些参数在所有类型中可能并不总是一致的。字典/词典/哈希表/等。对此有用,如序列化项目和/或XML和其他动态的东西。