GoF Design Patterns - какие из них вы на самом деле используете? [закрыто]

16

Я пытаюсь обучить своих коллег в области шаблонов проектирования. Некоторые из оригинальных шаблонов «Банды четырех» немного эзотеричны, поэтому мне интересно, есть ли подгруппа «существенных» шаблонов, которые должны знать все программисты. Просматривая список, я думаю, что, вероятно, использовал -

  • Абстрактная Фабрика
  • Заводской метод
  • одиночка
  • Мост
  • Фасад
  • команда

Какие из них вы фактически используете на практике, и для чего вы их используете?

Ссылка для тех, кто хочет список шаблонов

Крейг Шварц
источник
7
ИМХО, вопрос слишком расплывчат, чтобы давать полезную дискуссию. Вы хотите один ответ для каждого шаблона или один ответ для комбинации шаблонов?
Мак
Некоторые причины, по которым вы используете эти шаблоны, были бы полезны, иначе вы просто перечисляете понятия ... Представьте себе, что задаете вопрос: "Какие ключевые слова вы используете?" и собирать списки «и for, if, while...т. д.» - трудно измерить, насколько это бессмысленно.
ocodo
1
Я не согласен с Сломохо - думаю, было бы очень удобно узнать, какие ключевые слова обычно используются, а какие нет в языке. То же самое касается базовых классов, например.
Крейг Шварц
1
Изменил это немного больше - мы надеемся, что это вызовет лучшую дискуссию.
Крейг Шварц
1
Какие фрукты вы на самом деле едите? Мне любопытно узнать, что вы надеетесь получить от этого вопроса. Если вы видите шаблон, который использовали 3 или 4 человека, но у вас его нет, это заставит вас его использовать?
Марси

Ответы:

4

Вот список тех, которые я использовал или видел на практике:

Singleton - Объект приложения в ASP.Net, являющийся ярким примером этого.

Адаптер. Подключение к базам данных обычно может включать класс Адаптер, по крайней мере, в моей области .Net.

Factory - Общий для генерации объектов, хотя я видел это больше в некоторых старых классических ASP в те времена.

Стратегия - у меня было приложение, которое для каждого типа устройства имело схожую структуру для класса, которую я бы рассмотрел в качестве реализации этого шаблона.

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

JB King
источник
1
Все действительные использования. Для тех, кто также читает это - имейте в виду, что эти шаблоны, безусловно, не ограничиваются этим.
Борис Янков
5

Авторы составили образцы из наблюдаемых дизайнов, которые они нашли в реальных приложениях. Никто не может использовать их все, но все они используются.

smithco
источник
Для чего вы использовали кузнечное дело и для чего?
Крейг Шварц
@CraigS Я использовал многие из них. У авторов шаблонов дизайна есть множество хороших примеров с каждым шаблоном, который они описывают. Лучшее, что я могу предложить, - это потратить время на тщательное прочтение книги.
Смитко
3

Декоратор .

РЕДАКТИРОВАТЬ : почти в каждом проекте, который выходит за рамки «тривиальной» стадии, каждый заканчивается интерфейсом IAction (детали могут отличаться):

// Programming Language does not matter
interface IAction {
     bool operateOn(Foo* target);
     string getDisplayName(); // useful for debugging and logging
};

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

Например, LogAction(написать для регистрации и выполнить IAction), NullAction(ничего не делать и вернуть true), ActionList(выполнить список IActions и вернуть ANDing для bool). В некоторых случаях AndAction(имеет смысл возвращать AND двух разных действий, может быть короткое замыкание или нет) OrAction, также NotActionимеет смысл.

Хотя технически из приведенных выше примеров только LogAction является декоратором (другие не работают точно с 1 IAction), я все же считаю это обобщением шаблона Decorator, когда я создаю ActionList из LogActions of IActions.

Sjoerd
источник
Для чего ты это используешь?
Крейг Шварц
1
@CraigS Пример добавлен по запросу.
Sjoerd
На самом деле это больше похоже на сочетание Decorator и Composite, что прекрасно, и прекрасную демонстрацию того, что сложность в паттернах заключается не в том, чтобы использовать их независимо, а в том, чтобы смешивать их вместе :)
Matthieu M.
А да, это классика. Композитный по сравнению с командой. На самом деле есть название для этого патента: оно называется «Спецификация» ( en.wikipedia.org/wiki/Specification_pattern ).
Мартин Уикман,
2

Я предполагаю, что вы хотите ограничить вопрос использованием шаблонов в собственном коде / проектах (без библиотек классов и сторонних фреймворков).

Как и другие, я также чаще всего использовал шаблоны фабрики . потом

  • Синглтон : не так много в наше время, но все же иногда это необходимо, как правило, для глобальных данных конфигурации
  • Стратегия и метод шаблонов : довольно часто, например, для представления различных видов вычислений в нашем приложении
  • Builder : для сортировки результатов транзакций с системой мэйнфреймов в выходные объекты (в некоторых случаях это включает в себя значительный анализ текста и создание больших иерархий объектов)
  • Команда : я реализовал это только один раз много лет назад, но в настоящее время в нашем Java-проекте я время от времени использую Callables, которые, я считаю, в основном являются командами
Петер Тёрёк
источник
2

Я использовал многие другие, которые уже были упомянуты (Singleton, Factory, Builder, Command, Strategy и т. Д.)

Один из тех, кого я еще не упоминал, это Flyweight, который я часто использую. Ниже приведен пример реализации:

/**
 * Flyweight class representing OCR digits.
 * 
 * @author matt
 *
 */
public class Digit {
    /** Static flyweight map containing Digits which have been encountered. **/
    private static Map digits = new HashMap();

    /** The block of text representing Digit. **/
    private String blockRep = null;

    /** A map representing acceptable blocks of characters and the string representation of their
     * numerical equivalents.
     */
    public static final Map VALID_DIGITS;

    /** Enum of valid digits. **/
    public static enum DigitRep {
        ZERO    (   " _ \n" +
                    "| |\n" +
                    "|_|"       ),

        ONE (       "   \n" +
                    "  |\n" +
                    "  |"       ),

        TWO (       " _ \n" +
                    " _|\n" +
                    "|_ "       ),

        THREE   (   " _ \n" +
                    " _|\n" +
                    " _|"       ),

        FOUR    (   "   \n" +
                    "|_|\n" +
                    "  |"       ),

        FIVE    (   " _ \n" +
                    "|_ \n" +
                    " _|"       ),

        SIX     (   " _ \n" +
                    "|_ \n" +
                    "|_|"       ),

        SEVEN   (   " _ \n" +
                    "  |\n" +
                    "  |"       ),

        EIGHT   (   " _ \n" +
                    "|_|\n" +
                    "|_|"       ),

        NINE    (   " _ \n" +
                    "|_|\n" +
                    " _|"       );

        private String blockRep;

        DigitRep(String blockRep) {
            this.blockRep = blockRep;
        }

        @Override
        public String toString() {
            return blockRep;
        }
    }

    static {
        /* Initialize the map of acceptable character blocks. */
        Map tmpMap = new HashMap();
        tmpMap.put( DigitRep.ZERO.toString(),   "0");
        tmpMap.put( DigitRep.ONE.toString(),    "1");
        tmpMap.put( DigitRep.TWO.toString(),    "2");
        tmpMap.put( DigitRep.THREE.toString(),  "3");
        tmpMap.put( DigitRep.FOUR.toString(),   "4");
        tmpMap.put( DigitRep.FIVE.toString(),   "5");
        tmpMap.put( DigitRep.SIX.toString(),    "6");
        tmpMap.put( DigitRep.SEVEN.toString(),  "7");
        tmpMap.put( DigitRep.EIGHT.toString(),  "8");
        tmpMap.put( DigitRep.NINE.toString(),   "9");       
        VALID_DIGITS = Collections.unmodifiableMap(tmpMap);
    }

    /**
     * Private constructor to enforce flyweight/factory pattern.
     * 
     * @param blockRep
     */
    private Digit(String blockRep) {
        this.blockRep = blockRep;
    }

    /**
     * Flyweight factory method to create a Digit object from the "block"
     * representation of the digit.
     * @param blockRep The "block" representation of a digit.  Should look
     * something like:
     * " _ \n"
     * "|_|\n"
     * "|_|"
     * @return A flyweight Digit object representing the digit.
     */
    public static synchronized Digit getDigit(String blockRep) {
        Digit digit = digits.get(blockRep);
        if(digit == null) {
            digit = new Digit(blockRep);
            digits.put(blockRep, digit);
        }

        return digit;
    }

    /**
     * Determines whether or not the digit is valid.
     * @return true if the digit is valid, else false.
     */
    public boolean isValid() {
        return VALID_DIGITS.containsKey(blockRep);
    }

    /**
     * Accessor method to get the block representation of this digit.
     * 
     * @return
     */
    public String getBlockRep() {
        return blockRep;
    }

    @Override
    public String toString() {
        return VALID_DIGITS.containsKey(blockRep) ? VALID_DIGITS.get(blockRep) : "?";
    }
}
Мэтт Колдуэлл
источник
1
+1 один из наименее известных, но все еще невероятно полезных шаблонов.
MattDavey
2

Большинство оригинальных паттернов Gang of Four все еще используются сегодня, но есть и другие, которые сейчас популярны, которых нет в книге.

Найдите ссылку на Design Patters на языке, который вы используете. Они, как правило, более конкретны и используют специфические языковые возможности для реализации шаблонов более лаконичным и элегантным способом.

Три отличных ресурса для Шаблонов проектирования:

Книга "Head First Design Patterns" - язык выбора - Java, но он актуален для всех языков. Шаблоны проектирования dofactory - отличные и бесплатные объяснения шаблонов .net с кодом. PluralSight - библиотека шаблонов проектирования - эта программа платная, но слишком хороша, чтобы не включать ее в список.

Борис Янков
источник
1

Хорошо, если вы используете общие библиотеки, такие как ACE, вы в конечном итоге используете больше, чем вы думаете. Я широко использую Observer / Observable :-)

Компьютерщик
источник
1

Я использовал Builder по крайней мере один раз (тот же процесс конвертера мог построить вывод HTML или Excel).

Я часто использую Template Template (для задач, связанных с JDBC, или абстрактных контроллеров Swing).

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

Я также часто использую команды (Swing Actions) и Observers.

Однажды я использовал Mememento-подобное решение для обнаружения изменений в формах Swing. Форма будет сериализовать свое состояние, которое я сравнивал (равно ()) с более ранними состояниями.

Карл
источник
1

Я думаю, что у меня есть большинство из них через мою карьеру. я уверен, что не использовал только один шаблон адаптера, который реализован с множественным наследованием в книге, поскольку я не большой поклонник множественного наследования.

Рафаэль
источник
1

Я люблю Декоратор. Единственное, что я могу добавить к упомянутым, это Proxy.

Чак Стефански
источник