Показаны сообщения с ярлыком шаблон. Показать все сообщения
Показаны сообщения с ярлыком шаблон. Показать все сообщения

четверг, 18 февраля 2010 г.

Multiton

Хотел написать о БД, но перед обсуждением некоторых решений полезно знать что-такое мультитон. Это не столь распространенный шаблон, но я его буду использовать - поэтому, коротко о нем.

Синглетон - это хорошо. Нет, правда, иногда, это очень хорошо. Пойдем дальше.
Иногда, хочется их упорядочить. Одним из вариантов, это создание класса, который будет уметь раздавать синглетоны (причем, ответственность за то, что они будут существовать в единственном экземпляре, мы тоже возложем на него).


class A {
A()
}
class MyMultitone {
//probably, it's can be singletone
//...
A a;
static A getA(){
if(a == null){
a = new A();
}
return a;
}
static B getB(){...}
}

где такое может понадобится? - уже скоро, будьте с нами, не переключайтесь!

Справедливости ради стоит заметить, что так-как мультитон не устоявшийся шаблон взгляды на него несколько разнятся: (еще одна статья о нем)

Помните, что злоупотребление синглтонами опасно для архитектуры приложения.

пятница, 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();
}
}



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

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

Design patterns

При создании ПО часто возникают аналогичные задачи. Это происходит на всех уровнях - от организации сортировки, работе с БД и т.д. . Для упрощения жизни создаются библиотеки утилиты и другие вкусности. На уровне проектирования для этого существуют - шаблонные решения (design patterns). Их довольно много и структурируются они относительно решаемых задач (создание объектов, поведение, работа с потоками и другие). Для того, что бы не изобретать постоянно велосипед, мы будем рассматривать основные из них - те, без знания которых страшно ложится спать.

Первые на очереди синглетон и фабрика.

Поехали.