Vì vậy, tôi có một nhà máy tạo ra các đối tượng của các lớp khác nhau. Các lớp có thể đều bắt nguồn từ một tổ tiên trừu tượng. Nhà máy có tệp cấu hình (cú pháp JSON) và quyết định lớp nào sẽ được tạo, tùy thuộc vào cấu hình của người dùng.
Để đạt được điều này, nhà máy sử dụng boost :: property_tree để phân tích cú pháp JSON. Anh ta đi qua ptree và quyết định sẽ tạo ra vật thể cụ thể nào.
Tuy nhiên, các đối tượng sản phẩm có nhiều trường (thuộc tính). Tùy thuộc vào lớp cụ thể, đối tượng có khoảng 5-10 thuộc tính, trong tương lai có thể còn nhiều hơn nữa.
Vì vậy, tôi không chắc chắn cách xây dựng của các đối tượng sẽ trông như thế nào. Tôi có thể nghĩ về hai giải pháp:
1) Hàm tạo của sản phẩm hy vọng mọi thuộc tính là tham số, do đó, hàm tạo sẽ kết thúc với hơn 10 tham số. Điều này sẽ xấu và dẫn đến các dòng mã dài, không thể đọc được. Tuy nhiên, lợi thế là nhà máy có thể phân tích cú pháp JSON và gọi hàm tạo với các tham số chính xác. Lớp sản phẩm không cần biết rằng nó đã được tạo do cấu hình JSON. Không cần biết có JSON hay cấu hình nào liên quan.
2) Hàm tạo của sản phẩm chỉ mong đợi một đối số, đối tượng property_tree. Sau đó, nó có thể phân tích các thông tin cần thiết. Nếu thông tin trong cấu hình bị thiếu hoặc nằm ngoài giới hạn, mỗi lớp sản phẩm có thể phản ứng đúng. Nhà máy không cần biết những đối số nào cần thiết cho một số sản phẩm. Nhà máy cũng không cần biết cách phản ứng trong trường hợp cấu hình sai. Và giao diện constructor là thống nhất và nhỏ. Nhưng, như một bất lợi, sản phẩm cần trích xuất thông tin cần thiết từ JSON, do đó, nó biết cách nó được xây dựng.
Tôi có xu hướng thích giải pháp 2). Tuy nhiên, tôi không chắc đây có phải là mẫu nhà máy tốt không. Cảm thấy có phần sai khi cho sản phẩm biết rằng nó được tạo bằng cấu hình JSON. Mặt khác, các sản phẩm mới có thể được giới thiệu rất đơn giản.
Bất kỳ ý kiến về điều đó?