Шаблони дизайну GoF - які ви фактично використовуєте? [зачинено]


16

Я намагаюся навчити своїх колег в області дизайнерських моделей. Деякі з оригінальних моделей «Банда з чотирьох» трохи езотеричні, тому мені цікаво, чи існує підгрупа «суттєвих» зразків, які повинні знати всі програмісти. Переглядаючи список, я думаю, що я, ймовірно, використовував -

  • Анотація заводу
  • Фабричний метод
  • Сінглтон
  • Міст
  • Фасад
  • Командування

Які ви фактично використовуєте на практиці, і для чого ви їх використовуєте?

Посилання для тих, хто бажає список шаблонів


7
ІМХО, питання надто розпливчасте, щоб дати корисну дискусію. Ви хочете одну відповідь за шаблоном або одну відповідь за комбінацією візерунків?
Макке

Деякі причини, чому ви використовуєте ці шаблони, були б корисні, інакше ви просто перераховуєте поняття ... Уявіть собі, що задаєте питання: "Які ключові слова ви використовуєте?" а також збирати списки " for, if, while...тощо" - важко виміряти, наскільки безглуздим це буде.
ocodo

1
Я не погоджуюся з Сломоджо - я думаю, було б дуже зручно знати, які ключові слова зазвичай використовуються, а які - не мовою. Те саме стосується, наприклад, базових класів.
Крейг Шварце

1
Модифікували це трохи більше - сподіваємось, це зараз породжує кращу дискусію.
Крейг Шварце

1
Які види фруктів ви насправді їсте? Мені цікаво дізнатися, що ви сподіваєтеся вийти з цього питання. Якщо ви бачите шаблон, який використовували 3 або 4 людини, але ви цього не зробили, це змусить вас використовувати його?
Марсі

Відповіді:


4

Ось список тих, хто я використовував або бачив на практиці:

Singleton - об'єкт програми в ASP.Net є яскравим прикладом цього.

Адаптер - Підключення до баз даних зазвичай може включати клас адаптерів принаймні в моїй області .Net.

Фабрика - генерал для генерації об'єктів, хоча я бачив це ще в деяких старих класичних ASP ще в той час.

Стратегія - у мене була програма, яка для кожного типу пристроїв мала схожу структуру для класу, яку я вважала б реалізацією цього шаблону.

Фасад - Деяким чином це схоже на модель Адаптер з точки зору того, що це щось, що зазвичай поєднує пару систем.


1
Усі дійсні використання. Для тих, хто також читає це - майте на увазі, що ці зразки, безумовно, не обмежуються ними.
Борис Янков

5

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


Для чого ви використовували smithco, а для чого?
Крейг Шварце

@CraigS Я використовував багато з них. Автори дизайнерських шаблонів мають набір хороших прикладів із кожним описом, який вони описують. Найкраща пропозиція, яку я можу дати, - це витратити час на ретельне читання книги.
smithco

3

Декоратор .

EDIT : Майже в кожному проекті, який виходить за межі "тривіальної" стадії, в кінцевому підсумку працює інтерфейс IAction (деталі можуть відрізнятися):

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

Наступну годину я витрачаю на написання безлічі маленьких, майже тривіальних занять, які реалізують IAction. У поєднанні вони дуже потужні та гнучкі.

Наприклад LogAction(запишіть у журнал і виконайте IAction), NullAction(не робіть нічого і не повертайте істину), ActionList(виконайте список IActions і поверніть ANDing кутів). У деяких випадках ан AndAction(повернення І-дії двох дій, може бути коротким замиканням чи ні) OrAction, також NotActionмає сенс.

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


Для чого ви його використовуєте?
Крейг Шварце

1
Приклад @CraigS додано на запит.
Sjoerd

Насправді це більше схоже на поєднання декоратора та композиту, що чудово, і досконала демонстрація того, що труднощі з візерунками виникають не від їх використання самостійно, а від їх змішування разом :)
Матьє М. М.

Так, це класика. Він складений в поєднанні з командою. Насправді є назва цього патенту: він називається "Специфікація" ( 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

Більшість оригінальних моделей «Банда з чотирьох» досі застосовуються сьогодні, але є й інші популярні, яких немає в книзі.

Знайдіть посилання на дизайнерські малюнки мовою, якою ви користуєтесь. Вони, як правило, більш конкретні і використовують конкретні мовні функції, щоб реалізувати шаблони більш стислим та елегантним способом.

Три чудові ресурси для дизайну:

Книга "Шаблони дизайну перших шедеврів" - обрана мова - Java, але стосується всіх мов. dofactory Шаблони дизайну - чудові та безкоштовні розробки пояснення шаблонів .net з кодом. PluralSight - Бібліотека шаблонів дизайну - ця платна, але занадто гарна, щоб не включати її до списку.


1

Добре, якщо ви використовуєте звичайні бібліотеки, такі як ACE, ви в кінцевому підсумку використовуєте більше, ніж вважаєте, що використовуєте. Я широко використовую спостерігач / спостереження :-)


1

Я щонайменше один раз використовував Builder (той самий процес перетворення може створювати вихід HTML або Excel).

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

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

Я також часто використовую команди (Swing Actions), і спостерігачі також.

Одного разу я застосував подібне до Мементомо рішення для виявлення змін у формах Swing. Форма буде серіалізувати свій стан, що я порівняв (дорівнює ()) з попередніми станами.


1

Я вважаю, що я маю більшість із них у кар'єрі. Єдиний, на який я впевнений, що я не використовував це те, що шаблон адаптера, який реалізується з багаторазовим успадкуванням книги, оскільки я не є великим прихильником багатократного успадкування.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.