98
–
классы
делегируют
ответственность
одному
из
нескольких
вспомогательных подклассов, и вы хотите локализовать сведения о том, какой
вспомогательный подкласс является делегатом;
–
когда заранее неизвестны
типы и зависимости объектов, с которыми
должен работать ваш код;
–
фабричный метод отделяет код производства продуктов от остального
кода, который эти продукты использует;
–
благодаря этому, код производства можно расширять, не трогая
основной;
–
так,
для того чтобы, добавить поддержку нового продукта, вам нужно
создать новый подкласс и определить в нём фабричный метод,
возвращая оттуда
экземпляр нового продукта.
Мотивация
–
Когда вы хотите дать возможность пользователям расширять части
вашего фреймворка или библиотеки.
–
Пользователи могут расширять классы вашего фреймворка через
наследование. Но как сделать так, чтобы фреймворк создавал объекты из этих новых
классов, а не из стандартных?
–
Решением будет дать пользователям возможность расширять не только
желаемые компоненты, но и классы, которые создают эти компоненты. А для этого
создающие классы должны иметь
конкретные создающие методы, которые можно
определить.
–
Например, вы используете готовый UI-фреймворк для своего
приложения. Но вот беда — требуется иметь круглые кнопки, вместо стандартных
прямоугольных. Вы создаёте класс RoundButton. Но как сказать главному классу
фреймворка UIFramework, чтобы он
теперь создавал круглые кнопки, вместо
стандартных?
Пример
Автозавод выпускает различные автомобили (объекты в виде машин).
99
В оригинале:
–
разные классы реализуют интерфейс автомобиль;
–
непосредственно создавать объекты автомобилей;
–
нужно изменить клиента, чтобы сменить авто.
С использованием паттерна:
–
используйте класс carFactory class, чтобы создавать объекты- машины;
–
можно менять автомобиль, посредством изменения carFactory.
Пример
class 350Z implements Car;
// fast car
class Ram implements Car;
// truck
class Accord implements Car; //
family car
Car fast = new 350Z();
// returns fast car
public class carFactory {
public static Car create(String type) {
if (type.equals("fast"))
return new 350Z();
if (type.equals("truck"))
return new Ram();
else if (type.equals(“family”)
return new
Accord();
}
}
Car fast = carFactory.create("fast"); // returns fast
car
Достарыңызбен бөлісу: