Шаблоны проектирования — заводской шаблон

Шаблоны проектирования
Шаблоны проектирования — заводской шаблон

Введение

заводской узор(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

简单工厂

преимущество:

  1. Конкретная реализация скрыта: лайкCokeа такжеSprite, для такого продукта клиенту не нужно знать конкретную реализацию, а нужно только уметь им пользоваться;

  2. Клиенту нужно только использовать объект напрямую, и ему не нужно заботиться о том, как объектnewот;

  3. Муфта: Клиент не имеетnew xxxПри таком жестком кодировании более поздний дизайнер меняет фреймворк, а также меняются различные классы (кроме фабричного класса) Пока имя фабричного класса и имя метода остаются неизменными, код клиента не должен трогаться все.

недостаток:

  1. Расширение хлопотно и требует изменений в существующем коде. Если вы хотите добавить новый класс продукта, вам необходимо изменить код класса фабрики.
  2. Вся логика вынесена в фабричный класс, и если продуктов будет слишком много, читать станет крайне сложно, как только будет ошибка, так и будет все ГГ.

Шаблон фабричного метода

Шаблон фабричного метода(Фабричный метод) — это всего лишь один шаг вперед по сравнению с простой фабрикой.В шаблоне фабричного метода мы больше не предоставляем единый класс фабрики для создания всех объектов, а предоставляем разные фабрики для разных объектов. То есть у каждого объекта есть соответствующая фабрика.

пример

Продолжайте с приведенным выше примером счастливой воды. БудуФабрика счастливой воды (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

工厂方法

преимущество:

  1. Простой заводской шаблонВсе биты зарезервированы;
  2. В новых продуктах не нужно менять существующий код, достаточно реализовать соответствующий产品类,工厂实现类.

недостаток:

  1. увеличить нагрузку на систему;

  2. Когда добавляется много новых продуктов, объем кода резко увеличивается;

  3. Фабрика может производить только один продукт.