2011-08-26 36 views
7

Nhiều người nói rằng họ đang sử dụng mẫu nhà máy trong dự án của họ. Nhưng khi tôi thực sự nhìn thấy thực hiện của họ, nó trông hoàn toàn khác nhau từ định nghĩa những gì tôi đã đọc trong đầu cuốn sách đầu tiên. Trong cuốn sách họ đã mô tả hai loại mô hình nhà máy tức làCác câu hỏi liên quan đến mẫu Nhà máy

Factory Method: - Một lớp học quy định cụ thể sub-lớp học của mình để xác định các đối tượng để tạo ra dựa trên một số thông số. Vì vậy, chúng tôi hy vọng đây một số phương pháp trừu tượng trong lớp cơ sở whihich sẽ được thực hiện bởi con lớp và pupose điều đó sẽ tạo ra một số đối tượng

Abstract Factory: - Cung cấp một nhà máy (dưới hình thức giao diện hoặc trừu tượng nhà máy) để tạo gia đình của các đối tượng liên quan hoặc phụ thuộc mà không chỉ định các lớp bê tông của chúng.

Tôi có câu hỏi ở đây về ý nghĩa của họ đối với các đối tượng phụ thuộc hoặc liên quan . Cho phép tham khảo http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html. Theo hiểu biết của tôi, điều đó có nghĩa là trong FinancialToolsFactory (trong liên kết) có thể tạo ra TaxProcessor là một nhóm sản phẩm mà các sản phẩm tương tác actuall là CanadaTaxProcessorEuropeTaxProcessor. Vì vậy, ở đây chúng tôi sẽ có n số nhà máy bê tông (trong trường hợp này là CanadaFinancialToolsFactoryEuropeFinancialToolsFactory) sẽ được mở rộng/triển khai nhà máy trừu tượng trong trường hợp này là FinancialToolsFactory.

Vui lòng cho tôi biết nếu sự hiểu biết ở trên là chính xác vì tôi nghĩ đó là mấu chốt của mẫu Nhà máy.

Câu hỏi thứ hai:

Nội dung mọi người đang làm vào tên của mô hình nhà máy là dưới đây:

public class MyFactory 
{ 
    public static <T> T getObject(Class<T> cls) 
    { 
     if (cls == null) 
     { 
      throw new IllegalArgumentException("Invalid className"); 
     } 

     T daoObject = (T)map.get(cls); 

     if (daoObject == null) 
     { 
      daoObject = loadObject(cls); 
     } 

     return daoObject; 
    } 
} 

Họ chỉ đi qua lớp như Example.class từ phương pháp chính và nhận được trường hợp đối tượng cho lớp học cụ thể đó. Bây giờ nếu chúng ta đi theo khái niệm thực tế của mô hình nhà máy được mô tả trong đầu (từ đầu cuốn sách đầu tiên) và các trang web khác nó không theo bất kỳ của hai mô hình nhà máy. Đối với tôi, nó trông giống như một lớp tiện ích trong đó chúng ta đang chuyển lớp và nhận cá thể đối tượng. Vui lòng cho tôi biết nếu bạn đồng ý với điều này?

+0

Javadoc có nói rằng đây là việc triển khai mẫu nhà máy cổ điển như được giải thích trong những cuốn sách đó không? –

+0

Tôi đồng ý 100% cho câu hỏi thứ hai. Đó là "đăng ký tải chậm", không phải là "nhà máy" –

Trả lời

7

Hiểu biết của bạn về Phương thức nhà máy và Mô hình nhà máy trừu tượng là chính xác.

Khi mọi người tạo ra các lớp học có trách nhiệm chỉ để tạo ra các đối tượng khác, họ tự nhiên có xu hướng đặt tên cho họ là Nhà máy. Điều đó không phải là vô lý. Vấn đề là không có mẫu Nhà máy.

Lẫn lộn nảy sinh ở đây vì hai lý do:

  • Một số nhà phát triển chỉ muốn ném vào mô hình khác và tuyên bố rằng họ đang sử dụng "Pattern Factory", ám chỉ những đối tượng mà tạo ra những người khác

  • Nhà phát triển tìm hiểu về các mẫu thiết kế thấy rằng một lớp được gọi là Nhà máy, bất kể mẫu có được triển khai hay không và giả sử nó phải là Phương thức Nhà máy hoặc Nhà máy Tóm tắt. Điều này là khó hiểu bởi vì sau đó bạn đang cố gắng để tìm ra đó là một trong đó, gọi vào câu hỏi sự hiểu biết của riêng bạn về các mô hình thực tế.

Hãy nhớ rằng không chỉ là các mẫu thiết kế giải pháp cho các sự cố thường gặp mà còn phục vụ để thiết lập ngôn ngữ để thảo luận về thiết kế. Trong trường hợp này, ngôn ngữ thiết kế mà bạn mong đợi không phải là những gì nhà phát triển thực sự sử dụng. Những gì họ đang làm chỉ là sai nếu họ nói rằng họ đang sử dụng một mẫu thiết kế cụ thể.

+0

Cảm ơn derekerdmann. Nếu bạn có thể diễn tả suy nghĩ của mình về câu hỏi, ý nghĩa của họ đối với gia đình phụ thuộc hay đối tượng liên quan thì nó sẽ tuyệt vời hay bạn đồng ý với những gì tôi nói về gia đình của các đối tượng phụ thuộc hay liên quan? –

+0

Vì vậy, hãy nói rằng tôi có một lớp với một phương thức lấy một chuỗi và một số tham số trả về một thể hiện của một lớp được đưa ra bởi chuỗi và các tham số được truyền cho hàm tạo, điều này có phân loại thành mẫu Factory, thông qua sự phản chiếu không? –

+0

@Mohit Gupta - Vâng, hiểu biết của bạn là chính xác. – derekerdmann

2

những gì họ có nghĩa là bởi gia đình phụ thuộc hoặc liên quan đến đối tượng

Sử dụng một ví dụ từ Design Patterns bởi Gang of Four:

  • AbstractFactory (WidgetFactory)
  • ConcreteFactory (MotifWidgetFactory, PMWidgetFactory)
  • AbstractProduct (Window, ScrollBar)
  • ConcreteProduct (MotifWindow, MotifScrollBar, PMWindow, PMScrollBar)

public abstract class WidgetFactory {...}

public class MotifWidgetFactory extends WidgetFactory {...}

public class PMWidgetFactory extends WidgetFactory {...}

Hãy bắt đầu với MotifWidgetFactory. Nó sẽ tạo ra một dòng sản phẩm bê tông mở rộng hoặc thực hiện các sản phẩm trừu tượng. Vì tất cả chúng đều được xây dựng bởi cùng một nhà máy, chúng chơi tốt với nhau. Bạn không thể tạo PMScrollBar hoạt động với MotifWindow.

Nội dung mọi người đang làm vào tên của mô hình nhà máy nằm dưới ... nó trông giống như một lớp tiện ích mà chúng tôi đang đi qua các lớp và nhận được trường hợp đối tượng.

Ví dụ của bạn là nhà máy ở chỗ nó tạo đối tượng. Trong trường hợp này, lấy một singleton từ Map. Nó không theo các mẫu "Nhà máy Phương pháp" hoặc "Nhà máy Tóm tắt" và do đó chỉ là một nhà máy có tên.

0

chỉ là một quan sát về 'Thẻ Java được liên kết với câu hỏi này. Trong khi cuốn sách này có liên quan đến Java, nó được "kết hợp lỏng lẻo" giống như các mẫu thiết kế GOF cho hầu hết các ngôn ngữ O-O.

Do đó, thiết kế có thể liên quan đến các ngôn ngữ khác.

Các vấn đề liên quan