100
Рисунок 5.3 – Пример использования паттерна
Абстрактная фабрика — это порождающий паттерн проектирования,
который
позволяет создавать семейства связанных объектов, не привязываясь к конкретным
классам создаваемых объектов. Семейство зависимых продуктов. Скажем, Кресло +
Диван + Столик. Несколько вариаций этого семейства. Например, продукты Кресло,
Диван и Столик представлены в трёх разных стилях: Арт-деко, Викторианском и
Модерне.
Кроме того, вы не хотите вносить изменения в
существующий код при
добавлении новых продуктов или семейств в программу. Поставщики часто
обновляют свои каталоги, и вы бы не хотели менять уже написанный код каждый раз
при получении новых моделей мебели.
Далее вы создаёте абстрактную фабрику — общий интерфейс, который
содержит
методы создания всех продуктов семейства (например, создатьКресло,
создатьДиван и создатьСтолик). Эти операции должны возвращать абстрактные типы
продуктов, представленные интерфейсами, которые мы выделили ранее — Кресла,
Диваны и Столики.
Клиентский код должен работать как с фабриками, так и с продуктами только
через их общие интерфейсы. Это позволит подавать в ваши классы любой тип
фабрики и производить любые продукты, ничего не ломая.
5.5 Дженерики или обобщенные типы в Java.
101
Пример 1 – Определение обобщенных типов:
public interface List
{
void add(E x);
Iterator iterator();
}
public interface Iterator {
E next();
boolean hasNext();
}
public interface Map {
V put(K key, V value);
}
Пример 2 –определение (своего собственного) типа дженерика:
public class GenericClass {
private T obj;
public void setObj(T t) {obj = t;}
public T getObj() {return obj;}
public void print() {
System.
out
.println(obj);
}
}
Main:
GenericClass g = new GenericClass();
g.setObj(5); // auto-boxing
int i = g.getObj(); // auto-unboxing
g.print();
Пример
class Crossover {}
class Garage {
private Crossover parkedAuto;
public Garage(Crossover parkedAuto) {
this.parkedAuto = parkedAuto;
}
public Crossover getParkedAuto(){ return
parkedAuto;}
}
class Man {
public static void main(String[] args) {
Garage garage = new Garage (new Crossover());
}
}
102
Проблемы
Обычные классы и методы работаю с конкретными типами (примитивы или
классы). Что делать, если нужно работать с разнообразными типами?
Пример иерархии типов
class Auto {}
class Crossover extends Auto{}
class Hatchback extends Auto{}
class Garage {
private Auto parkedAuto;
public Garage(Auto parkedAuto) { //
конструктор
this.parkedAuto = parkedAuto;
}
public Auto getParkedAuto(){
return parkedAuto;}
}
class Main {
public static void main(String[] args) {
Garage garage = new Garage (new Crossover());
Garage anotherGarage = new Garage (new
Hatchback());
}
}
Достарыңызбен бөлісу: