Patterns: Prototype (Прототип) 4


BeerMixПродовжуємо вивчати шаблони проектування на прикладі алкоголю і Java, тож цього разу я дуже хочу пива, тому говоритиму про пиво. Вірніше, навіть не стільки про пиво, як про бірмікси, які я, чесно кажучи, люблю більше за більшість сортів пива. Насправді бірмікс зробити дуже просто навіть у домашніх умовах: треба просто взяти пива і додати туди фруктового сиропу (на кухоль пива десь так грам 50 сиропу) і розмішати.

У Франківську щось схоже робили у пабі “Десятка” (не реклама, стейки у них не фонтан) і я там іноді таке замовляв. Підозрюю, що популярні бірмікси у банках готують десь так само, просто до пива додають не сироп, а просто якийсь порошок. Та це не так важливо, бо бірмікс нам зара потрібен фактично лиш як ілюстрація патерну “прототип”.

Традиційно цитатка з вікіпедії і діаграма звідтіля ж. Патерн прототип задає види об’єктів, що створюються, за допомогою екземпляру-прототипу, та створює нові об’єкти шляхом копіювання цього прототипу.

Патерн Prototype

Як все це виглядає на практиці? Ми маємо пиво, яке імплементує інтерфейс Cloneable, тобто може бути легко скопійоване (ех, якби ж так зі справжнім пивом можна було…), а також може бути змішане з фруктовим сиропчиком за допомогою методу makeBeerMix(), якому ми передаємо параметром відповідний сироп.

class Beer implements Cloneable {
    private double volume;
    private String beerType;

    public Beer() {
        beerType = "Lager";
        volume = 0.5;
    }

    public Beer clone() {
        return new Beer();
    }

    public void makeBeerMix(String fruitType) {
        beerType = "BeerMix with " + fruitType + " flavour";
        volume += 0.05;
    }

    public String getBeerType() {
        return beerType;
    }
}

Тепер уявимо собі бар “Десятка”, де якраз готують і подають бірмікс. Вони мають якесь звичайне собі пиво, з якого просто роблять копію щоразу і додають потрібний сироп:

public class Pub {

    public static void main(String args[]) {
        Pub the10pub = new Pub();
        Beer beer = new Beer();

        Beer beerMixLemon = the10pub.makeBeerMix(beer.clone(), "Lemon");
        Beer beerMixStrawberry = the10pub.makeBeerMix(beer.clone(), "Strawberry");

        System.out.println("Got: " + beerMixLemon.getBeerType());
        System.out.println("Got: " + beerMixStrawberry.getBeerType());
    }

    public Beer makeBeerMix(Beer basicBeer, String fruitType) {
        basicBeer.makeBeerMix(fruitType);
        return basicBeer;
    }
}

Наша діаграмка пеертворится у щось таке:

Prototype

Оскільки бірмікс за своєю суттю теж пиво, то згодом до нього ще можна додавати якісь інгредієнти і створити цілком інший “пивний” напій, лиш не думайте мішати з горілкою 😉

А приклад використання цього патерну у Java можна спостерігати фактично у самих основах цієї мови, а саме у кореневому об’єкті Object

Почитайте ще оце:


Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

4 thoughts on “Patterns: Prototype (Прототип)

  • Андрій

    От коли вчився у академії серва то що що а по патернах я був 0 ) Дякую) Наче зрозумів, тобто це як просте наслідування класу і його розширення/зміна?

    • Akceptor Від автора

      Щось у цьому є 🙂
      Просто коли ти наслідуєш клас, то мусиш у його нащадку передбачити потрібні тобі нововведення. Грубо кажучи, якщо бірмікс екстандить пиво, то ти просто маєш пиво і імплементуєш у ньому якісь додаткові властивості – той же сироп. Але якщо для пива треба задати при створенні купу параметрів (міцність, кількість сухої речовини у суслі, etc.) то ти робитимеш це і для бірміксу.
      Прототип дозволяє мати готовий шаблон (тобто вже створене пиво у бочці) і додавати до його копії-клона лише різні сиропи.
      Такий приклад.
      Уявімо що кожного разу виклик new Beer() лізе у якусь далеку і тормознуту базу даних аби взяти звідти інформацію про пиво. Якщо ти робиш 100 бірміксів, які екстендять пиво, то конструктор Beer() буде викликано 100 раз.
      А прототип створить одне пиво а далі просто буде його клонувати, вже не стукаючись у базу.