Познавам и често използвам класическия шаблон за проектиране „Builder“, който е описан между другото тук. Сега обаче имам случай, в който бих искал да използвам нещо като модел на Builder, но в този конкретен случай не трябва да задавам никакви параметри в моя "Builder", защото всички стойности, които се използват от "Builder" са постоянни и не трябва да се задават динамично. Внедрих моя "Builder" сега като класически Builder, като този (кодът е опростен):
final class MyBuilder {
private static final String FOO = "foo";
private static final String BAR = "bar";
private List<MyResult> results = new ArrayList<>();
MyBuilder() {
// empty constructor
}
List<MyResult> build() {
results.add(createFoo());
results.add(createBar());
return results;
}
private MyResult createFoo() {
...
}
private MyResult createBar() {
...
}
...
}
Този конструктор се използва така:
MyBuilder resultsBuilder = new MyBuilder();
List<MyResult> results = resultsBuilder.build();
или може да се използва алтернативно така:
List<MyResult> results = new MyBuilder().build();
Поради факта, че за разлика от класическия Builder, този конкретен "Builder" не очаква никакви входни параметри (не трябва да се извикват сетери на builder), той може да предостави статичен метод, който ще създаде негов екземпляр и ще върне окончателния резултат, така че конструкторът да може да се използва по следния начин:
List<MyResult> results = MyBuilder.build();
„Builder“ може да съдържа следния код в такъв случай (методът build() е статичен):
final class MyBuilder {
private static final String FOO = "foo";
private static final String BAR = "bar";
private List<MyResult> results = new ArrayList<>();
private MyBuilder() {
// hidden constructor
}
static List<MyResult> build() {
MyBuilder builder = new MyBuilder();
return builder.build();
}
private List<MyResult> buildResults() {
results.add(createFoo());
results.add(createBar());
return results;
}
private MyResult createFoo() {
...
}
private MyResult createBar() {
...
}
...
}
Все още ли е строител? Подходяща ли е такава модификация на шаблона на Builder според вас? Съществува ли различен дизайн модел, който би могъл да бъде по-подходящ в този конкретен случай?
Бях чел за модел на фабричен метод, но стигнах до заключението, че моят случай не е модел на фабричен метод, защото не използва полиморфизъм. Вижте първото изречение на горепосочената статия:
„В програмирането, базирано на класове, моделът на фабричния метод е модел на създаване, който използва фабрични методи, за да се справи с проблема за създаване на обекти без да указва точния клас обект, който ще бъде създаден.“
Посочвам точния клас на обектите, които ще бъдат създадени от моя статичен метод. Вижте също главата Дефиниция в гореспоменатата статия:
„Моделът на фабричния метод не трябва да се бърка с по-общото понятие за фабрики и фабрични методи. Моделът на фабричен метод е най-известното използване на фабрики и фабрични методи, но не всички употреби на фабричните методи са примери за модел на фабричен метод – само когато е включено наследяване (клас, имплементиращ интерфейс, или производен клас, имплементира фабричен метод) това е пример за модела на фабричния метод По-основните употреби на фабриките не са примери за модела на фабричния метод, а вместо това могат да бъдат наричани фабричен модел или проста фабрика; те се обсъждат на фабрика."
Така че може би това е един вид проста фабрика (да не се бърка с модел на фабричен метод)? Какво мислиш за това?
Как трябва да се нарича класът "MyBuilder" (където "My" е контейнер за конкретно име на бизнеса)? Може би MyFactory?