2010-02-11 20 views
5

Tôi chưa bao giờ sử dụng các Nhà máy trước đây vì lý do đơn giản, tôi không hiểu khi nào tôi cần chúng. Tôi đã làm việc trên một trò chơi nhỏ trong thời gian rảnh rỗi của tôi, và tôi quyết định thực hiện FMOD cho âm thanh. Tôi nhìn một wrapper thiết kế cho OpenAL (cài đặt âm thanh khác nhau) và nó trông giống như ...Hiểu các nhà máy và tôi có nên sử dụng chúng không?

SoundObject * SoundObjectManager * SoundObjectFactory *

Các SoundObject là về cơ bản thể hiện của từng đối tượng âm thanh. SoundObjectManager chỉ quản lý tất cả các đối tượng này. Điều này là thẳng về phía trước đủ và làm cho rất nhiều ý nghĩa, nhưng tôi không nhận được những gì các nhà máy đang làm hoặc những gì nó được sử dụng. Tôi đã đọc về các Nhà máy nhưng vẫn không thực sự có được chúng.

Mọi trợ giúp sẽ được đánh giá cao!

Trả lời

2

Hãy nghĩ về Nhà máy là "nhà xây dựng ảo". Nó cho phép bạn xây dựng các đối tượng với một kiểu thời gian biên dịch thông thường nhưng các kiểu thời gian chạy khác nhau. Bạn có thể chuyển đổi hành vi đơn giản bằng cách yêu cầu Nhà máy tạo một cá thể của một kiểu thời gian chạy khác.

+0

Vì vậy, đối với một cái gì đó như thế này nó thực sự là không cần thiết? Xem xét tôi sẽ luôn luôn chỉ được sử dụng các trường hợp của SoundObject * và chỉ là một singleton của người quản lý. –

+0

Nếu bạn không có các kiểu phụ SoundObject khác nhau, tôi muốn nói "không". – duffymo

+0

Không thực sự, Mục đích trong việc sử dụng mô hình là để cách nhiệt việc tạo ra các đối tượng từ việc sử dụng chúng. Điều này cho phép các kiểu dẫn xuất mới được giới thiệu mà không thay đổi mã sử dụng lớp cơ sở. Bạn có thể có các kiểu con của SoundObject, nhưng bạn chỉ không biết nó, Nhà máy cách ly bạn khỏi những chi tiết thực hiện đó –

1

Nhà máy được sử dụng khi triển khai cần được tham số. FMOD là nền tảng chéo, cần phải quyết định triển khai cụ thể nào để cung cấp cho bạn nền tảng của mình. Đó là những gì Nhà máy đang làm. Có hai Mẫu chính Abstract Factory PatternFactory Method Pattern.

1

Tình huống giả thuyết: Tôi đang viết một thư viện âm thanh mà tôi muốn chạy trên nhiều nền tảng. Tôi sẽ cố gắng để làm cho càng nhiều mã càng tốt là nền tảng độc lập, nhưng chắc chắn một số của nó sẽ cần phải thay đổi cho Windows so với OSX so với Linux.

Vì vậy, tôi viết tất cả các triển khai khác nhau, nhưng tôi không muốn người dùng cuối phải thực hiện chương trình của họ phụ thuộc vào Linux hoặc Windows hoặc bất kỳ thứ gì. Tôi cũng không muốn duy trì 4 giao diện khác nhau cho API của mình. (Lưu ý đây chỉ là một số lý do bạn có thể tạo một nhà máy - chắc chắn có những tình huống khác).

Vì vậy, tôi xác định lớp cơ sở chung chung này là SoundObject xác định tất cả các phương thức mà ứng dụng khách sẽ sử dụng. Sau đó, tôi tạo LinuxSoundObject, WindowsSoundObject và 5 số khác xuất phát từ SoundObject. Nhưng tôi sẽ ẩn tất cả các triển khai cụ thể này khỏi người dùng và chỉ cung cấp cho họ SoundObject. Thay vào đó, bạn phải gọi cho tôi SoundObjectFactory để lấy những gì có vẻ như bạn là một đồng bằng cũ SoundObject, nhưng thực sự tôi đã chọn loại thời gian chạy chính xác cho bạn và tự khởi tạo nó.

2 năm sau, một hệ điều hành mới xuất hiện và thay thế Windows. Thay vì buộc bạn viết lại phần mềm của mình, tôi chỉ cập nhật thư viện của mình để hỗ trợ nền tảng mới và bạn không bao giờ thấy thay đổi đối với giao diện.

Tất cả điều này khá giả tạo, nhưng hy vọng bạn sẽ có được ý tưởng.

Các nhà máy cô lập người tiêu dùng của giao diện từ loại thời gian chạy nào (tức là triển khai) thực sự đang được sử dụng.

+0

Điều đó làm cho cảm giác hoàn hảo, bạn nên xem xét viết C++ cho sách dummies lol. Theo như liên kết đi mặc dù tôi đăng trong bình luận ở trên, im vẫn không chính xác chắc chắn những gì hes làm, nhưng nó LOOKS như hes sử dụng nhà máy để biến nó thành một MovableObject, nhưng tôi không thực sự nhận được điều đó. Vì đây chỉ là một dự án học tập, tôi sẽ đi mà không có một cho bây giờ tôi giả sử và tôi sẽ biết khi nào tôi cần sử dụng nó trong tương lai. –

+0

Đây không phải là C++ cụ thể, nó là một mẫu thiết kế chung cho tất cả các ngôn ngữ OO (và một số không phải OO) –

0

Nhà máy có thể được sử dụng để thực hiện đảo ngược kiểm soát và để tách mã instantiation ('mới') khỏi logic của các thành phần của bạn. Điều này rất hữu ích khi bạn viết các bài kiểm tra đơn vị vì bạn có thể không muốn các đối tượng thử nghiệm tạo ra một loạt các đối tượng khác.

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