2009-02-11 38 views
6

Tôi có một ABC với một số lớp dẫn xuất. Để tạo các lớp thừa tôi sử dụng mô hình nhà máy:Đối tượng nhà máy và chức năng của nhà máy

.h file:

class derivedFactory 
{ 
public: 
    base* createInstance(); 
}; 

cpp file:

base* derivedFactory::createInstance() 
{ 
    return new derived(); 
} 

Có lợi thế này trên chỉ có một chức năng miễn phí:

tập tin .h:

base* derivedFactoryFunction(); 

.cpp tệp:

base* derivedFactoryFunction() 
{ 
    return new derived(); 
} 

Ngoài ra: Tôi sử dụng mẫu nhà máy trừu tượng để tiêm phụ thuộc. Tôi có thể sử dụng một hệ thống phân cấp thừa kế dựa trên ABC:

class objectCreator 
{ 
public: 
    base* create() = 0; 
}; 

Có lợi thế nào để sử dụng này trên một con trỏ hàm:

boost::function<base*()> factory_ptr; 

Sử dụng boost :: bind/lambda này dường như làm cho mã của tôi hợp lý hơn, và nếu tôi ước tôi có thể bọc một vật thể thực sự trong đó. Tôi có thể thấy rằng có thể có một hiệu suất giảm nhẹ nhưng điều này là rất nhiều lo lắng vì nó chỉ được gọi là trong khi khởi động.

Trả lời

2

Tùy thuộc vào mức độ linh hoạt mà nhà máy của bạn cần. Nếu nhà máy cần thông tin bên ngoài (như từ tệp cấu hình, tùy chọn chương trình, v.v.) để xác định cách xây dựng đối tượng, hơn là đối tượng có ý nghĩa. Nếu tất cả những gì bạn cần là trong các đối số cho nhà máy, hơn một hàm có lẽ là tốt.

Lợi thế duy nhất tôi có thể thấy để có con trỏ là để thử nghiệm, nơi bạn có thể sử dụng chức năng nhà máy khác.

+0

Con trỏ sẽ cho phép triển khai mẫu nhà máy trừu tượng. Tôi đã mở rộng trên nó ở trên –

1

Có giao diện với một phương thức đơn hoặc con trỏ đến phương thức tương đương.

Nhưng trong trường hợp thứ hai, bạn sẽ gặp rắc rối nếu bạn muốn một phương pháp khác để đi cùng với ther đầu tiên ...

Và giao diện dễ đọc hơn so con trỏ phương pháp theo ý kiến ​​của tôi.

Sau đó, bạn đã chọn.

1

Tôi muốn nói rằng lợi thế của việc có chức năng nhà máy là một phương pháp tĩnh trong chính lớp đó là rõ ràng rằng nó là một phần của vòng đời của lớp đó. Làm cho nó có nghĩa là các lập trình viên khác, những người sử dụng lớp của bạn sẽ phải tìm một nơi khác để tìm phương pháp nhà máy.

Xin lỗi tôi không chắc chắn chính xác những gì bạn muốn nói bằng cách di chuyển con trỏ hàm tới phương pháp yếu tố, nhưng tôi thường sẽ không sử dụng con trỏ hàm nếu bạn không cần. Các con trỏ hàm không thể được gạch chân vì chúng không thể được giải quyết tại thời gian biên dịch, có nghĩa là chúng có thể chậm hơn. Nhưng bên cạnh đó, nó chỉ có vẻ xấu thiết kế để sử dụng một con trỏ hàm nếu bạn đã có thể chắc chắn về chức năng mà bạn sẽ gọi lúc biên dịch thời gian.

1

Bạn có bao giờ muốn nhiều hơn một nhà máy cho một loại không? Nếu vậy, bạn cần đối tượng nhà máy.

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