2010-03-29 38 views
6

sự hiểu biết của tôi về Factory Method Pattern là (Đúng tôi nếu tôi đã sai lầm)Factory Method Pattern rõ

Factory Method Pattern

"Factory Method cho phép khách hàng để các đại biểu việc tạo ra sản phẩm (Tạo bản sao) cho lớp con ".

Có hai trường hợp mà chúng tôi có thể tạo mô hình Phương thức nhà máy.

(i) Khi khách hàng bị hạn chế tạo sản phẩm (Instance).

(ii) Có nhiều sản phẩm available.But một quyết định phải được thực hiện mà dụ sản phẩm cần phải được trả lại.

Nếu bạn muốn tạo Tóm tắt Phương pháp mô hình

  • Bạn cần có sản phẩm trừu tượng
  • bê tông Sản phẩm
  • Factory Method để trả lại sản phẩm thích hợp.

Ví dụ:

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

} 

là sự hiểu biết của tôi về Nhà máy Phương pháp là đúng?

+0

btw, sử dụng một 'enum' như thế này là khả năng dẫn đến không cần thiết' switch'-ing. Trong những trường hợp như vậy, tôi thích sử dụng một chức năng khác cho mỗi lựa chọn. –

Trả lời

1

Những gì bạn có ở đó thực sự là một số Abstract Factory Pattern, chỉ có bạn là nhà máy (Creator) không trừu tượng. Các mô hình phương pháp nhân tố là đặc biệt hữu ích cho subclassing:

class A { 
public: 
    A() : m_Member(GetMember()) 
    { 
    } 
protected: 
    virtual ISomeInterface * GetMember() { // default impl here } 
private: 
    ISomeInterface * m_Member; 
} 

Bây giờ lớp con của A có thể ghi đè GetMember để làm cho cha sử dụng thực hiện cụ thể của ISomeInterface.

+0

hahaha, điều này thực sự làm tôi cười khi bạn sửa tôi về điều này ** không ** là một * Nhà máy Pattern * !! Tôi không có cách nào tranh luận với bạn nhưng chỉ đọc to điều đó. Với một sự thay đổi nhỏ của từ: "Những gì bạn có là một * Tóm tắt Nhà máy Pattern * chỉ rằng nhà máy của bạn không phải là trừu tượng". Sẽ không phải là một * Tóm tắt Nhà máy Pattern * mà không có phần trừu tượng là một * Nhà máy Pattern *? ;-) (Hoàn thành lưỡi-trong-má ở đây - Tôi không quen với sự khác biệt giữa hai.) – Jaxidian

+0

Tôi nhận được cách mà âm thanh buồn cười. Tuy nhiên, tôi chọn từ ngữ vì mô hình nhà máy trừu tượng có hai mức độ tự do: nhà máy và các sản phẩm. Trường hợp mà chỉ có một nhà máy (và do đó không cần cho nó được absract) xảy ra rất thường xuyên, ít nhất là trong kinh nghiệm của tôi, và có thể được coi là một trường hợp đặc biệt. Ngoài ra, GOF-book liệt kê các mô hình như mô hình nhà máy trừu tượng, và sử dụng tên chính xác là quan trọng. –

+0

Vì vậy, nó! Trong thực tế, điều đầu tiên bên trong cuốn sách, trên bìa trước, là một điều đáng lo ngại về Abstract Factory. Bây giờ tôi nhớ khi lần đầu tiên tôi đọc rằng tôi nghĩ, "Nghe có vẻ giống như một mẫu nhà máy tiêu chuẩn." Tôi đã làm điều đó với một vài mẫu của họ. Tuy nhiên, tôi muốn chomp một chút ở đây về bình luận của bạn "tên chính xác" - có nhiều tên SOO cho cùng một điều mà tất cả đều được coi là "chính xác". Chỉ vì GOF gọi nó là gì đó, mặc dù đó là kinda ** cuốn sách ** cho các mẫu, không có nghĩa là nó chỉ đúng. Đó là, sau khi tất cả, khá ngày ... – Jaxidian

-1

Có, đó dường như là một cách chính xác để thực hiện điều này, mặc dù khá đơn giản. Trong thực tế, bạn có thể muốn tính đến việc truyền vào các thông số khác nhau có thể không phải lúc nào cũng nhất quán trên tất cả các loại. Từ điển/Danh sách/Hashtables/v.v. hữu ích cho việc này, cũng như các mục được tuần tự hóa và/hoặc XML và các thứ năng động khác.

+1

-1 bởi vì, như tôi đã chỉ ra trong câu trả lời của tôi, đây không phải là một phương pháp nhà máy, vì vậy đây không phải là một cách chính xác để thực hiện điều này. –

0

Xác định giao diện để tạo đối tượng , nhưng hãy để lớp con quyết định lớp nào sẽ khởi tạo. Nhà máy Phương pháp cho phép lớp học trì hoãn việc phân giải cho các lớp con.

biết thêm chi tiết và ví dụ có: http://www.dofactory.com/Patterns/PatternFactory.aspx