工厂方法模式说明

时间:2010-03-29 18:02:17

标签: asp.net design-patterns

我对工厂方法模式的理解是(纠正我,如果我错了

工厂方式模式

“工厂方法允许客户将产品创建(实例创建)委托给子类”。

有两种情况我们可以创建工厂方法模式。

(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();

}

我对工厂方法的理解是否正确?

3 个答案:

答案 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和其他动态的东西。