Tôi tin rằng mẫu thiết kế phương thức nhà máy phù hợp với những gì tôi đang cố gắng làm, nhưng tôi không chắc chắn bao nhiêu trách nhiệm (kiến thức về các lớp con mà nó tạo ra) để cung cấp cho nó. Các ví dụ về cách sử dụng factory method pattern tại Wikipedia mô tả tình hình tôi đang ở gần như chính xác:Nhà máy biết loại đối tượng nào cần tạo?
public class ImageReaderFactory
{
public static ImageReader getImageReader(InputStream is)
{
int imageType = figureOutImageType(is);
switch(imageType)
{
case ImageReaderFactory.GIF:
return new GifReader(is);
case ImageReaderFactory.JPEG:
return new JpegReader(is);
// etc.
}
}
}
Câu hỏi của tôi là, những gì hiện các figureOutImageType
chức năng như thế nào? Trong ví dụ cụ thể này, tôi giả định rằng nó sẽ kiểm tra tiêu đề của tệp trong số InputStream
để xác định định dạng dữ liệu nào. Tôi muốn biết liệu số ImageReaderFactory
có biết cách phân tích cú pháp tiêu đề tệp hay không và xác định xem loại tệp có phải là GIF hay không , JPEG, vv, hoặc nếu nó gọi một hàm bên trong mỗi lớp Reader
cho phép nó biết loại hình ảnh đó là gì. Một cái gì đó như thế này, có lẽ:
int figureOutImageType(InputStream is)
{
if(GifReader.isGIF(is))
return ImageReaderFactory.GIF;
else if(JpegReader.isJPEG(is))
return ImageReaderFactory.JPEG;
// etc.
}
Nó có vẻ như có nhà máy biết làm thế nào để phân tích các hình ảnh vi phạm đóng gói, và cho phép các lớp con quyết định cái nào nên được tạo là một phần của các mẫu thiết kế phương pháp nhà máy. Tuy nhiên, nó cũng có vẻ như các chức năng figureOutImageType
chỉ là thêm một số mã dự phòng, bởi vì tại sao không chỉ có mỗi phân lớp thực hiện kiểm tra của nó trên InputStream
trong chức năng getImageReader
và bỏ qua trường hợp chuyển đổi?
Tôi chưa từng có kinh nghiệm sử dụng các nhà máy trước đây và tôi hy vọng có được một số thông tin chi tiết từ một số người đã sử dụng chúng trong quá khứ theo cách tốt nhất để xử lý vấn đề này. Nhà máy có biết về hoạt động bên trong của các lớp con của nó hay không, hoặc họ có chịu trách nhiệm cho phép nhà máy biết tạo ra cái gì không và làm thế nào để bạn tổ chức nó?
Cảm ơn!
Câu hỏi tuyệt vời, được suy nghĩ kỹ lưỡng. 1, nhiều hơn nếu nó chỉ có thể! – hmcclungiii
Đồng ý. Câu hỏi hay. – Ankur