Mẫu nhà máy không phải là kẻ vi phạm là OCP.
Tùy thuộc vào cách bạn có hành vi của Complex
hơn nữa.
Nếu Complex
là cần thiết để hỗ trợ việc sản xuất các loại mới của Complex
đối tượng, và bạn chọn để sửa đổi Complex
bằng cách thêm fromX
phương pháp mới được bổ sung để hỗ trợ họ, sau đó điều này có nghĩa rằng Complex
trở thành một người vi phạm của OCP vì Complex
phải được mở lại cho sửa đổi:
class Complex
{
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
//class opened for modification
public static Complex fromOtherMeans(String x , String y) {
return new Complex(x, y);
}
}
bạn có thể đẩy vấn đề này xuống vào một tập tin văn bản hoặc tập tin thuộc tính của một số loại để giải oan cho mình vì phải thay đổi lớp java, nhưng nó không ngăn cản bạn từ việc phải viết thêm logic trong lĩnh vực này của giải pháp theo thứ tự er để hỗ trợ các loại mới Complex
.
Tùy thuộc vào việc sử dụng Complex
trong thiết kế của bạn (các loại khác nhau như thế nào? Bạn đang sử dụng chúng như thế nào?), Có một số tùy chọn thay thế có thể áp dụng tốt.
Một ví dụ như OCP thay thế thân thiện là phân lớp Complex
để cung cấp phương thức nhà máy bổ sung. Một lớp con là minh hoạ đơn giản nhất về cách Complex
được mở rộng nhưng không được sửa đổi.
Một OCP thay thế thân thiện khác để thay đổi Complex
trong trường hợp này là Decorator pattern. Liên tục trang trí Complex
với khả năng tạo các biến thể mới của Complex
tôn trọng OCP vì Complex
không được sửa đổi nhưng được mở rộng bằng cách gói nó với chức năng mới.
Phương án thay thế thứ ba có thể là thay đổi cấu trúc của Complex
để tính toán của nó được cung cấp theo bố cục. Điều này sẽ mở ra cho bạn cơ hội sử dụng số Strategy pattern để phân biệt giữa các hành vi khác nhau của Complex
.
Điều về mẫu Nhà máy là nó giúp tuân thủ mã ngữ cảnh OCP. Người ta có thể sử dụng một trong những kỹ thuật trên để ở bên phải của OCP với lớp Nhà máy của họ, nhưng đồng nghiệp của bạn có thể xem xét đồ thị đối tượng, đặt câu hỏi về sự khôn ngoan của việc có đồ thị đối tượng trên một Nhà máy và đơn giản hóa nó trở lại một Nhà máy, đưa bạn trở lại ví dụ đầu tiên.
Trong trường hợp này, thay vì cố gắng uốn cong việc triển khai mẫu Nhà máy để tôn trọng các nguyên tắc SOLID, hãy xem xét lý do bạn sử dụng nó ở tất cả.
Tôi muốn biết bạn nghĩ gì về điều này trước khi tôi trả lời. Câu trả lời của bạn sẽ khiến tôi cảm thấy bạn đang tìm câu trả lời. Nếu không nó giống như bạn đang gia công phần mềm công việc của bạn để SO. –
Rất tiếc, đã lên kế hoạch để thêm nhận xét nhưng bị bỏ qua bởi công việc. :) Tôi nghĩ rằng nó vi phạm nó. Xin vui lòng sửa tôi nếu tôi sai, nhưng FMP ra lệnh cho một nhà xây dựng riêng, và một nhà xây dựng riêng cấm mở rộng. Ngoài ra, sẽ không phải lớp học phải được sửa đổi để hỗ trợ triển khai thay thế? Tôi đang nghĩ về tình huống mà một lớp học có phương pháp nhà máy tĩnh. Có lẽ đây chỉ là một hương vị của FMP? –
Nếu nó là một lớp con, bạn có thể sử dụng phương thức này hoặc sử dụng super() (giả sử Java). Tốt hơn là bạn không nên có các phương thức tĩnh và có một phương thức duy nhất lấy các tham số để chọn một tham số bằng cách sử dụng một câu lệnh switch hoặc bằng cách đọc trong một tệp cấu hình được cung cấp. –