Builder без входни параметри, със статичен метод на изграждане?

Познавам и често използвам класическия шаблон за проектиране „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?


person krm    schedule 30.09.2014    source източник


Отговори (1)


Не е сглобител. Не мисля, че е просто фабричен метод, т.е. метод за производство на фиксиран обект.

Конструкторът ви позволява да укажете опции за обекта, който да бъде изграден, преди да бъде изграден, така че изграденият екземпляр да може да се променя. Фабричен метод просто произвежда екземпляр на вашия обект, когато се извика и често е статичен.

Бихте могли да обмислите подход, при който вашият клас на builder е статичен метод за връщане на екземпляр на builder по подразбиране, който има много от предварително конфигурираните опции, които след това можете да модифицирате допълнително. Но ако винаги искате да върнете един и същ обект, вашият фабричен метод е наред.

person Sam Holder    schedule 30.09.2014
comment
Бях чел същата статия в Wiki за модела на фабричния метод, посочен от вас, преди да напиша въпроса си. Стигнах до извода, че моят случай не е модел на фабричен метод, защото не използва полиморфизъм. Вижте първото изречение на тази статия: В базираното на клас програмиране моделът на фабричните методи е модел на създаване, който използва фабрични методи, за да се справи с проблема за създаване на обекти, без да посочва точния клас обект, който ще бъде създаден. Посочвам точния клас на обектите, които ще бъдат създадени от моя статичен метод. Вижте също главата Дефиниция. - person krm; 30.09.2014
comment
Главата за дефиниция на същата статия в Wiki гласи: Моделът на фабричния метод не трябва да се бърка с по-общото понятие за фабрики и фабрични методи. Моделът на фабричния метод е най-известното използване на фабрики и фабрични методи, но не всички употреби на фабричните методи са примери за модела на фабричния метод – само когато е включено наследяване (клас, имплементиращ интерфейс, или производен клас, имплементира фабрика метод) това е пример за модела на фабричния метод. ... - person krm; 30.09.2014
comment
@krm да, вероятно си прав, това не е фабричен метод в истинската дефиниция на шаблона, а просто малък фабричен метод „f“, т.е. метод за създаване на обект. така или иначе, мисля, че основният момент остава, че вашият клас не е строител. Актуализирах отговора. - person Sam Holder; 30.09.2014
comment
Благодаря ти Сам. Започнах да отговарям, използвайки коментарите под вашия отговор, но стигнах до заключението, че това е твърде много текст и добавих мислите си за това към основния въпрос. И аз съм склонен към извода, че е някакъв обикновен завод. Как бихте нарекли класа в моя случай, който съдържа този (и само този) статичен фабричен метод? По-скоро не е Builder, но може ли да се нарече MyFactory (частта My, разбира се, е контейнер за нещо специфично за бизнеса). - person krm; 30.09.2014
comment
Добавих +1 за вашия отговор, но все още нямам търпение да чуя какво може да кажат други хора за това. - person krm; 30.09.2014
comment
@krm : Любопитен съм да разбера кой модел си използвал тук. Не е builder.. Разбирам.. и предполагам, че сте използвали варианта на factory и как? - person Prakruti Pathik; 24.06.2021