Введение
заводской узор(Factory Pattern) специально отвечает за создание экземпляров большого количества классов с общим интерфейсом. Фабричный шаблон может динамически решать, какой класс создавать, не зная заранее, какой класс создавать каждый раз.
Простая фабричная выкройка.
Простой заводской шаблон(Простой заводской шаблон): также известен какстатический фабричный метод(Статический метод фабрики), который относится к режиму создания класса. В простом фабричном шаблоне экземпляры разных классов могут быть возвращены в зависимости от параметров. Простой фабричный шаблон специально определяет класс, ответственный за создание экземпляров других классов, и созданные экземпляры обычно имеют общий родительский класс. Простые фабрики не входят в число 23 шаблонов проектирования.
пример
Все виды счастливой воды, которую любит толстяк (имеется в виду он сам) Happy Water (интерфейс продукта)
public interface Kls {
String name();
}
Fat House Happy Water-Coke (конкретный продукт)
public class Coke implements Kls {
@Override
public String name() {
return "肥宅快乐水-可乐";
}
}
Счастливая вода - спрайт (конкретный продукт)
public class Sprite implements Kls {
@Override
public String name() {
return "快乐水-雪碧";
}
}
Фабрика счастливой воды (категория фабрики)
public class KlsFactory {
public static Kls getFzs(String type) throws Exception {
Kls fzs = null;
if ("coke".equalsIgnoreCase(type)) {
fzs = new Coke();
} else if ("sprite".equalsIgnoreCase(type)) {
fzs = new Sprite();
}
if (Objects.isNull(fzs)) {
throw new RuntimeException("没找到快乐水~");
}
return fzs;
}
}
Толстый дом (заказчик)
public class Fz {
@Test
public void drink() throws Exception {
// 制造可乐
Kls coke = KlsFactory.getFzs("coke");
System.out.println("肥宅开始喝:" + coke.name());
// 制造雪碧
Kls sprite = KlsFactory.getFzs("sprite");
System.out.println("肥宅开始喝:" + sprite.name());
}
}
Диаграмма классов UML
преимущество:
-
Конкретная реализация скрыта: лайк
Coke
а такжеSprite
, для такого продукта клиенту не нужно знать конкретную реализацию, а нужно только уметь им пользоваться; -
Клиенту нужно только использовать объект напрямую, и ему не нужно заботиться о том, как объект
new
от; -
Муфта: Клиент не имеет
new xxx
При таком жестком кодировании более поздний дизайнер меняет фреймворк, а также меняются различные классы (кроме фабричного класса) Пока имя фабричного класса и имя метода остаются неизменными, код клиента не должен трогаться все.
недостаток:
- Расширение хлопотно и требует изменений в существующем коде. Если вы хотите добавить новый класс продукта, вам необходимо изменить код класса фабрики.
- Вся логика вынесена в фабричный класс, и если продуктов будет слишком много, читать станет крайне сложно, как только будет ошибка, так и будет все ГГ.
Шаблон фабричного метода
Шаблон фабричного метода(Фабричный метод) — это всего лишь один шаг вперед по сравнению с простой фабрикой.В шаблоне фабричного метода мы больше не предоставляем единый класс фабрики для создания всех объектов, а предоставляем разные фабрики для разных объектов. То есть у каждого объекта есть соответствующая фабрика.
пример
Продолжайте с приведенным выше примером счастливой воды. БудуФабрика счастливой воды (KlsFactory
)Абстрагируйте общий метод, вновь появляющийся на конкретном заводе по производству счастливой воды, соответственно.
Фабрика счастливой воды
public interface Factory {
/**
* 制造快乐水
*
* @return Kls
*/
Kls create();
}
завод колы
public class CokeFactory implements Factory {
@Override
public Kls create() {
return new Coke();
}
}
Фабрика спрайтов
public class SpriteFactory implements Factory {
@Override
public Kls create() {
return new Sprite();
}
}
толстый дом
public class Fz {
@Test
public void drink() throws Exception {
// 制造可乐
CokeFactory cokeFactory = new CokeFactory();
Kls coke = cokeFactory.create();
System.out.println("肥宅开始喝:" + coke.name());
// 制造雪碧
SpriteFactory spriteFactory = new SpriteFactory();
Kls sprite = spriteFactory.create();
System.out.println("肥宅开始喝:" + sprite.name());
}
}
Развернуть Fanta Happy Water Фанта Хэппи Уотер
public class Fanta implements Kls {
@Override
public String name() {
return "快乐水-芬达";
}
}
Фабрика Фанта
public class FantaFactory implements Factory {
@Override
public Kls create() {
return new Fanta();
}
}
Добавлен толстый дом
FantaFactory fantaFactory = new FantaFactory();
Kls fanta = fantaFactory.create();
System.out.println("肥宅开始喝:" + fanta.name());
Диаграмма классов UML
преимущество:
- Простой заводской шаблонВсе биты зарезервированы;
- В новых продуктах не нужно менять существующий код, достаточно реализовать соответствующий
产品类
,工厂实现类
.
недостаток:
-
увеличить нагрузку на систему;
-
Когда добавляется много новых продуктов, объем кода резко увеличивается;
-
Фабрика может производить только один продукт.