julia_v_iluhina

Untitled

Oct 17th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.57 KB | None | 0 0
  1.    https://jlordiales.me/2012/12/13/the-builder-pattern-in-practice/
  2.    http://www.journaldev.com/1425/builder-design-pattern-in-java
  3.  
  4.    По этим линкам - по моему мнению - неплохо и несложно разъяснено про паттерн Builder
  5.    по второй линке - вообще пошагово
  6.    
  7.    еще и это пригодится
  8.     вот неплохие линки - про использование this
  9.            https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html
  10.            http://stackoverflow.com/questions/2411270/when-should-i-use-this-in-a-class
  11.  
  12.    буду иносказательной и я)
  13.  
  14.    У нас будет класс = то, что мы строим
  15.    и его внутренний класс (а если точнее - nested static class) = builder = как мы это строим
  16.  
  17.    мы хотим строить пошагово -
  18.    сначала описать - что мы строим = рассказать в сколь угодно много шагов(любая их комбинация)
  19.    а потом - по собранной в шагах информации - построим наш объект
  20.  
  21.    и поскольку - чтобы строить объект - мы применяем класс-строитель
  22.    то - конструктор для нашего объекта - не нужно делать public
  23.  
  24.    Допустим, мы делаем некий напиток
  25.    мы можем добавлять
  26.        воду
  27.        сахар
  28.        красители
  29.        алкоголь
  30.        фрукты
  31.    паковать это в некую тару
  32.  
  33.    ну и вот это все в комплексе - и есть создание напитка
  34.  
  35.    вот и создаем класс Drink = т к делаем мы напиток
  36.    и у него внутри - реализуем и класс-строитель = Barman
  37.  
  38.    public class Drink {
  39.        private int water;
  40.        private int sugar;
  41.        private List<Colour> colours;
  42.        private List<Alcohol> alcohols;
  43.        private List<Fruit> fruits;
  44.        private Bottle bottle;
  45.        /*
  46.            все свойства конечного объекта=напитка - описываем как private поля объекта
  47.        */
  48.  
  49.        private Drink(Barman barman) {
  50.            water = barman.water;
  51.            sugar = barman.sugar ;
  52.            colours = barman.colours;
  53.            alcohols = barman.alcohols;
  54.            fruits = barman.fruits;
  55.            bottle = barman.bottle;
  56.            ...
  57.        }
  58.        /*
  59.            конструктор этого класса = тоже private (выше писала - почему так)
  60.            и в качестве параметра он получает как раз объекта-строителя
  61.  
  62.            в конструкторе - переносим данные из строителя  - в поля нашего объекта
  63.            и далее - (см "..." в коде) при необходимости как-то работаем с данными
  64.            как-то = как нам нужно
  65.        */
  66.  
  67.  
  68.        public static class Barman {
  69.            private int water;
  70.            private int sugar;
  71.            private List<Colour> colours;
  72.            private List<Alcohol> alcohols;
  73.            private List<Fruit> fruits;
  74.            private Bottle bottle;
  75.            /*
  76.                у класса-строителя - такой же набор полей,
  77.                и они тоже private
  78.  
  79.                все методы этого класса, кроме одного(build()) -
  80.                как раз и будут собирать эти свойства
  81.            */
  82.  
  83.            public Barman(Bottle bottle) {
  84.                this.bottle = bottle;
  85.                colours = new ArrayList<Colours> ();
  86.                ...
  87.            }
  88.            /*
  89.                конструктор класса-строителя - объявляем как public
  90.                здесь мы инициализируем все поля этого класса
  91.  
  92.                если это необходимо - можно реализовать конструктор с параметрами
  93.                цель - передать то, что будет обязательным для заполнения
  94.            */
  95.  
  96.            public Barman addWater(int water) {
  97.                this.water += water;
  98.                return this;
  99.            }
  100.            /*
  101.                каждый из методов, заполняющих какое-либо из свойств - это public метод
  102.                и возвращает такой метод самого объекта-строителя
  103.            */
  104.  
  105.            public Barman addFruits(Fruit... fruits) {
  106.                for (Fruit fruit:fruits) {
  107.                    this.fruits.add(fruit);
  108.                }
  109.                return this
  110.            }
  111.            /*
  112.                заметь - такие методы не заново заполняют соответствующие поля - а лишь дополняют то,
  113.                что мы изначально задали в конструкторе
  114.  
  115.                цель - иметь возможность многократно и в любой последовательности вызывать методы строителя
  116.  
  117.                для каждого из свойств - реализуем такого плана метод
  118.            */
  119.  
  120.            public Drink build() {
  121.                return new Drink(this);
  122.            }
  123.            /*
  124.                а этот метод класса-строителя - возвращает новый объект - который мы как раз строим
  125.                и передаем в конструктор - this = наш объект-строитель
  126.  
  127.                собственно - фактически это и будет создание нашего объекта Drink
  128.                (вспомни - что мы делали в конструкторе класса Drink)
  129.            */
  130.        }
  131.    }
  132.  
  133.    /*
  134.        если минимально - то это все)
  135.  
  136.        теперь мы можем создать нашего строителя
  137.        new Drink.Barman(bottle)
  138.  
  139.        а чтоб эту часть кода сделать нагляднее - можем в классе Drink
  140.        реализовать static метод, возвращающий новый объект типа строитель
  141.  
  142.        например
  143.  
  144.    */
  145.    public class Drink {
  146.        ....
  147.  
  148.        public static Barman composeDrink(Bottle bottle) {
  149.            return new Barman(bottle);
  150.        }
  151.  
  152.        public static class Barman {
  153.            ...
  154.        }
  155.    }
  156.  
  157.    /*
  158.         и далее в коде
  159.         применив import static для  composeDrink -
  160.         писать
  161.    */
  162.  
  163.        composeDrink(bottle)
  164.  
  165.        а не
  166.  
  167.        new Drink.Barman(bottle)
  168.  
  169.    /*
  170.        ну и далее - начинается самое интересное
  171.  
  172.        composeDrink(bottle) - возвращает объект-строитель
  173.        у которого много методов, "доливающих" наш напиток = уточняющих наш рецепт
  174.  
  175.        а т к каждый из этих методов - возвращает тот же объект
  176.        мы можем строить любые цепочки вызовов
  177.        и заканчивать такую цепочку - вызовом build
  178.  
  179.        только в вызове build -  и будет построен объект
  180.        согласно тому - что мы уточнили ранее
  181.  
  182.    */
  183.       composeDrink(bottle).addWater(...).addAlcohol(...).addFruits(...).addColor(...).addFruits(...).build(); - некий коктейль )
  184.       ...
  185.       composeDrink(bottle).addWater(...).build(); - просто бутылка с водой
  186.       ...
  187.       composeDrink(bottle).build();  - вообще пустая бутылка )
  188.  
  189.  
  190.       теперь вспоминаем - о чем это мы
  191.  
  192.       мы собирались делать вот что
  193.        given().build() - ни одной таски
  194.        given().activeTasks("a","b","c").completedTasks("d", "e").atAllFilter().build() - разные таски на таком-то фильтре
  195.        given()......build() - можно разные делать - в зависимости от потребностей
  196.  
  197.       Видишь сходство? )
  198.  
  199.       Если это все сложно - то пока просто сохрани себе это
  200.       Во второй части курса прокачаем скиллы, которые и это позволят осилить
  201.  
  202.       как и писала ранее - экономически не оправдано в задаче такого уровня применять этот паттерн
  203.       тут можно прекрасно реализовать несколько гивен-методов
  204.       и этого будет  - с головой достаточно)
  205.      
  206.       постаралась иносказательно ответить на все твои вопросы из слека
  207.       если это сложно - значит пока рановато)
Advertisement
Add Comment
Please, Sign In to add comment