2010-03-26 34 views
30

Tôi nhìn thấy từ được ném xung quanh thường xuyên, và tôi có thể đã sử dụng nó bản thân mình trong mã và thư viện theo thời gian, nhưng tôi không bao giờ thực sự có nó. Trong hầu hết các bài viết tôi gặp phải, họ cứ tiếp tục mong bạn tìm ra nó.Chính xác thì Nhà máy Lớp là gì?

Nhà máy lớp học là gì? Ai đó có thể giải thích khái niệm?

Trả lời

12

Một nhà máy lớp tạo ra các phiên bản của các lớp khác. Thông thường, các lớp họ tạo ra chia sẻ một lớp cơ sở chung hoặc giao diện, nhưng các lớp dẫn xuất được trả về.

Ví dụ, bạn có thể có một nhà máy lớp diễn một chuỗi kết nối cơ sở dữ liệu và trở về một lớp học thực hiện IDbConnection như SqlConnection (class và interface từ Net)

5

Một nhà máy lớp học là một phương pháp (theo một số tham số ví dụ) trả về cho bạn một lớp tùy chỉnh (không được khởi tạo!).

1

Tôi cảm thấy rằng điều này giải thích khá tốt (đối với tôi, dù sao). Các nhà máy lớp được sử dụng trong mô hình thiết kế nhà máy, tôi nghĩ vậy.

Giống như mẫu creational khác, nó [thiết kế mô hình nhà máy] giao dịch với các vấn đề của việc tạo ra đối tượng (sản phẩm) mà không chỉ định lớp chính xác của đối tượng đó sẽ tạo. Phương thức thiết kế phương thức factory xử lý vấn đề này bằng cách định nghĩa một phương thức riêng biệt để tạo các đối tượng, mà lớp con sau đó có thể ghi đè để chỉ định loại sản phẩm có nguồn gốc sẽ được tạo ra . Nói chung, thuật ngữ nhà máy thường được sử dụng để tham chiếu cho bất kỳ phương pháp nào có mục đích chính là tạo đối tượng.

http://en.wikipedia.org/wiki/Factory_method_pattern

Xin lỗi nếu bạn đã đọc và thấy nó là không đủ.

1

Các bài viết Wikipedia đưa ra một định nghĩa khá tốt: http://en.wikipedia.org/wiki/Factory_pattern

Nhưng có lẽ định nghĩa có thẩm quyền nhất sẽ được tìm thấy trong cuốn sách Mẫu thiết kế của Gamma et al. (thường được gọi là Gang of Four Book).

25

Thông tin bổ sung của Heres có thể giúp hiểu rõ hơn về một số câu trả lời chính xác khác, nhưng ngắn hơn. Theo nghĩa hẹp nhất, Nhà máy Lớp là một hàm hoặc phương thức tạo hoặc chọn một lớp và trả về lớp, dựa trên một số điều kiện được xác định từ các tham số đầu vào hoặc ngữ cảnh chung. Điều này là bắt buộc khi không thể xác định loại đối tượng cần thiết cho đến khi thời gian chạy. Việc thực hiện có thể được thực hiện trực tiếp khi các lớp là chính các đối tượng trong ngôn ngữ đang được sử dụng, chẳng hạn như Python.

Vì việc sử dụng chính của bất kỳ lớp nào là tạo ra các thể hiện của chính nó, trong các ngôn ngữ như C++, nơi các lớp không phải là các đối tượng có thể được truyền xung quanh và thao tác, một kết quả tương tự thường có thể đạt được bằng cách mô phỏng "các nhà xây dựng ảo", nơi bạn gọi một hàm tạo lớp cơ sở nhưng lấy lại một cá thể của một số lớp dẫn xuất.Điều này phải được mô phỏng bởi vì các hàm tạo không thể thực sự là virtual trong C++, đó là lý do tại sao đối tượng đó — không phải lớp — nhà máy thường được triển khai dưới dạng hàm độc lập hoặc phương thức tĩnh.

chức năng ảo thường được giải quyết "late" bởi các loại thực tế của đối tượng tham chiếu, nhưng trong trường hợp nhà thầu, các đối tượng không tồn tại, vì vậy loại phải được xác định bởi một số phương tiện khác. Việc triển khai tốt nhất là những người xử lý các lớp ứng cử viên mới một cách tự động khi chúng được thêm vào thay vì chỉ có một tập hợp hữu hạn nào đó hiện được mã hóa cứng vào nhà máy (mặc dù việc trao đổi thường được chấp nhận nếu nhà máy là nơi duy nhất yêu cầu sửa đổi).

Cuốn sách 1991 của James Coplien Advanced C++: Programming Styles and Idioms có chi tiết về một cách để triển khai các nhà xây dựng chung ảo như vậy trong C++. Thậm chí còn có nhiều cách tốt hơn để thực hiện việc này bằng cách sử dụng C++ templates, nhưng điều đó không được đề cập trong cuốn sách trước khi được thêm vào định nghĩa ngôn ngữ chuẩn. Thực tế, các bản mẫu C++ là các nhà máy lớp vì chúng khởi tạo một lớp mới bất cứ khi nào chúng được sử dụng với các đối số kiểu thực tế khác nhau. Cập nhật: Tôi đã viết một bài báo năm 1998 mà ông viết cho EuroPLoP có tiêu đề C++ Idioms, trong số những thứ khác, ông sửa đổi và tập hợp các thành ngữ trong sách của mình thành mẫu thiết kế mẫu la la năm 1994 Design Patterns: Elements of Re-Usable Object-Oriented Software. Lưu ý đặc biệt là phần Virtual Constructor (sử dụng cấu trúc mẫu Envelope/Letter).

Xem thêm các câu trả lời có liên quan ở đây cho câu hỏi Class factory in Python. Xem thêm Abstract Factory, Template Style là bài viết của Tiến sĩ Dobb năm 2001 cũng về việc triển khai chúng với các mẫu C++.

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