2010-03-29 49 views
6

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

工厂方法模式

“工厂方法允许客户端的代表产品创建(实例创建)到子类“。

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

(i)当客户端被限制到产品(实例)创建。

(II)有多种产品available.But要做出一个决定返回哪些产品实例 需要。

如果你想创建抽象方法模式

  • 你需要有抽象产品
  • 混凝土制品
  • 工厂方法返回相应的产品。

例子:

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

顺便说一句,使用'enum'这样有可能导致不必要的'之开关-ING。在这种情况下,我更喜欢为每个选择使用不同的功能。 – 2010-03-29 19:38:46

回答

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

+0

哈哈哈,当你纠正我这个**而不是**工厂模式时,这真的让我发笑!我绝对不会和你争论,只是大声读出来。稍作改动:“你所拥有的是*抽象工厂模式*只有你的工厂不抽象”。如果抽象工厂模式*没有抽象部分就不是*工厂模式*? ;-)(在这里完成了一番舌头 - 我不熟悉两者之间的区别)。 – Jaxidian 2010-03-29 18:35:39

+0

我明白了这听起来很有趣。但是,我选择措辞是因为抽象工厂模式有两个自由度:工厂和产品。至少在我的经验中,经常会发生这样的情况,即只有一家工厂(因此不需要它是绝对的),并且可以被认为是一种特殊情况。另外,GOF-book将模式列为抽象工厂模式,使用正确的名称非常重要。 – 2010-03-29 19:20:14

+0

所以它!实际上,封面上的第一件事是关于抽象工厂的一幕。我现在记得当我第一次读到时,我想,“这听起来像一个标准的工厂模式。”我用他们的一些模式做了这个。然而,我想在这里对你的“正确的名字”评论做一些简单的介绍 - 有很多同名的SOO名称都被认为是“正确的”。仅仅因为GOF称它为某种东西,尽管这是一本关于模式的书,并不意味着它是唯一正确的东西。毕竟,这是相当过时的... – Jaxidian 2010-03-29 20:29:01

-1

是的,这似乎是一个正确的方式来实现这一点,虽然很简单。实际上,您可能需要考虑各种参数的传入,这些参数在所有类型中可能并不总是一致的。字典/词典/哈希表/等。对于这一点非常有用,正如序列化的项目和/或XML以及其他有趣的事物一样。

+1

-1因为正如我在我的回答中指出的那样,这不是一种工厂方法,所以这不是实现这一点的正确方法。 – 2010-03-29 18:12:08