Mam więc fabrykę, która tworzy obiekty różnych klas. Wszystkie możliwe klasy pochodzą od abstrakcyjnego przodka. Fabryka ma plik konfiguracyjny (składnia JSON) i decyduje, którą klasę utworzyć, w zależności od konfiguracji użytkownika.
Aby to osiągnąć, fabryka używa boost :: property_tree do parsowania JSON. Przechodzi przez ptree i decyduje, który konkretny obiekt stworzyć.
Jednak obiekty produktu mają wiele pól (atrybutów). W zależności od konkretnej klasy obiekt ma około 5-10 atrybutów, w przyszłości może nawet więcej.
Nie jestem więc pewien, jak powinien wyglądać konstruktor obiektów. Mogę wymyślić dwa rozwiązania:
1) Konstruktor produktu oczekuje każdego atrybutu jako parametru, dlatego konstruktor otrzyma ponad 10 parametrów. Będzie to brzydkie i doprowadzi do długich, nieczytelnych linii kodu. Zaletą jest jednak to, że fabryka może przeanalizować JSON i wywołać konstruktor z poprawnymi parametrami. Klasa produktu nie musi wiedzieć, że została utworzona z powodu konfiguracji JSON. Nie musi wiedzieć, że w ogóle jest zaangażowany JSON lub konfiguracja.
2) Konstruktor produktu oczekuje tylko jednego argumentu, obiektu property_tree. Następnie może przeanalizować potrzebne informacje. Jeśli brakuje informacji w konfiguracji lub jest ona poza zakresem, każda klasa produktu może zareagować poprawnie. Fabryka nie musi wiedzieć, jakich argumentów potrzebuje kilka produktów. Fabryka nie musi także wiedzieć, jak zareagować w przypadku nieprawidłowej konfiguracji. Interfejs konstruktora jest zunifikowany i mały. Jednak wadą jest, że produkt musi wyodrębnić potrzebne informacje z JSON, dlatego wie, jak jest skonstruowany.
Wolę rozwiązanie 2). Nie jestem jednak pewien, czy jest to dobry wzór fabryczny. Wydaje się, że to źle, informując produkt, że został utworzony w konfiguracji JSON. Z drugiej strony nowe produkty można wprowadzać bardzo prosto.
Jakieś opinie na ten temat?