пятница, 12 февраля 2010 г.

Абстрактная фабрика

Если я подойду к стойке бара и попрошу мне налить, то, в зависимости от заведения, мне могут налить совсем разные вещи хотя запрос был-то одинаков и я был тот-же.
К чему это я? Продолжаем нашу сагу о том, как не изобретать велосипед.
Бары это все хорошо, но далеко. Пусть есть классы кнопочек для графического интерфейса. Для каждой ОС они свои но я хочу получать кнопочку под текущую ОС и не напрягать себя лишними проверками. Что я делаю - создаю отдельный класс, который будет мне выдавать нужную мне кнопочку. Так.. пожалуй достаточно, надо ближе к коду.

Абстрактная кухня
public interface AbstractCook {
Dish getDish();
Drink getDrink();
}


Мексиканская кухня
public class MexicoCook imlements AbstractCook {
@Override
public Dish getDish(){
return new Burrito();
}
@Override
public Drink getDrink(){{
return new Tequila();
}
}


А вот немецкая
public class GermanCook imlements AbstractCook {
@Override
public Dish getDish(){
return new Meat();
}
@Override
public Drink getDrink(){{
return new Bear();
}
}


разница, думаю, заметна)

а теперь об использовании счастья

class User {
eatSomething(AbstractCook cook){
cook.getDish();
}
}



В этом участке кода пользователь не знает что он съел, а значит можно писать программу для всех возможных вариантов пищеупотребления.

Переходим на новый уровень абстракции вместе!

1 комментарий:

  1. пример неплохой, но по большей мере лажа...
    было бы интересно почитать про назначение паттерна, детальном его описании, структуре и ключевых моментах архитектуры.

    ИМХО

    ОтветитьУдалить