Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Общие вопросы по программированию, компьютерным наукам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 21.06.2009, 05:20   #31
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 111
Репутация: 63

skype: atomicxp
Радость критика неудачного примера

Рассмотрим абстрактные фабрики более внимательно. Как известно любая система состоит из элементов, эти части называют элементарными. Именно с ними оперируют люди, когда собирают или пересобирают свои системы. Помимо этого, сами элементы могут состоять из элементов по некой другой классификации. Иными словами хотя для нас эти элементы уже не делятся на подэлементы и являются сборками, с другой стороны их можно рассматривать на более глубоком уровне.

В данном случае речь об интерфейсах, обзор которых проведён выше. Были выделены интерфейсы с различным свойствами. Во-первых, методы включённые в них могут находится в различных секциях, открытой и защищённой, но наверное чаще всего в открытой. Во-вторых, в одном случае интерфейсам позволяли удалять объект на который они ссылаются, а в другом нет. Пока условно обзову один абстрактным, в нём запрещено пользоваться деструктором, а второй объектным, там это соответственно разрешено.

abstract interface
Код:

class AbstractInterface
{
 protected:
    ~AbstractInterface(){}
 public:
    virtual void ma() = 0;
    virtual void mb() = 0;
};

object interface
Код:

class ObjectInterface
{
 public:
    virtual ~ObjectInterface(){}
 public:
    virtual void ma() = 0;
    virtual void mb() = 0;
};

пример использования:
Код:

#include <iostream>

using namespace std;

class AbstractInterface
{
 protected:
    ~AbstractInterface(){ cout << "Desctruction AbstractInterface" << endl; }
 public:
    virtual void ma() = 0;
    virtual void mb() = 0;
};

class ObjectInterface
{
 public:
    virtual ~ObjectInterface(){ cout << "Desctruction ObjectInterface" << endl; }
 public:
    virtual void ma() = 0;
    virtual void mb() = 0;
};

class ClassAI : public AbstractInterface
{
 public:
    ~ClassAI(){ cout << "Desctruction ClassA" << endl; }
 public:
    void ma()
    {
        cout << "ClassAI: Method A" << endl;
    }
    void mb()
    {
        cout << "ClassAI: Method B" << endl;
    }
};

class ClassOI : public ObjectInterface
{
 public:
    ~ClassOI(){ cout << "Desctruction ClassB" << endl; }
 public:
    void ma()
    {
        cout << "ClassOI: Method A" << endl;
    }
    void mb()
    {
        cout << "ClassOI: Method B" << endl;
    }
};

void Testing()
{
    cout << "Testing ObjectInterface" << endl;

    ClassOI* classOI = new ClassOI();

    classOI->ma();
    classOI->mb();

    ObjectInterface* objectInterface = classOI;

    objectInterface->ma();
    objectInterface->mb();

    delete objectInterface; // удаление через интерфейс разрешено
    //delete classOI; // удаление через объект разрешено

    cout << '\n' << "Testing AbstractInterface" << endl;

    ClassAI* classAI = new ClassAI();

    classAI->ma();
    classAI->mb();

    AbstractInterface* abstractInterface = classAI;

    abstractInterface->ma();
    abstractInterface->mb();

    //delete abstractInterface; // удаление через интерфейс запрещено
    delete classAI; // удаление через объект разрешено
}

int main()
{
    Testing();

    return 0;
}

Вывод консоли:
Код:

Testing ObjectInterface
ClassOI: Method A
ClassOI: Method B
ClassOI: Method A
ClassOI: Method B
Desctruction ClassB
Desctruction ObjectInterface

Testing AbstractInterface
ClassAI: Method A
ClassAI: Method B
ClassAI: Method A
ClassAI: Method B
Desctruction ClassA
Desctruction AbstractInterface

В примере из вики для построения абстрактной фабрики использовались объектные интерфейсы способные вызывать утечку памяти. Такой интерфейс вывел бы:
Код:

Testing ObjectInterface
ClassOI: Method A
ClassOI: Method B
ClassOI: Method A
ClassOI: Method B

Вместо:
Код:

Testing ObjectInterface
ClassOI: Method A
ClassOI: Method B
ClassOI: Method A
ClassOI: Method B
Desctruction ClassB
Desctruction ObjectInterface

atomicxp вне форума   Ответить с цитированием
Старый 21.06.2009, 05:22   #32
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 111
Репутация: 63

skype: atomicxp
Радость

Кстати, насчёт утечек памяти и всего прочего. В источниках информации посвящённых C++ этому уделяется огромное значение, что не совсем понятно. Не проще ли тупо использовать готовые реализованные шаблоны проектирования, которые гарантированно не вызовут утечек, чем каждый раз надоедать программистам со всякой ерундой.

Следующий вопрос на повестке дня о том, что уже сама по себе абстрактная фабрика является не хилым извращением. Если же ещё попытаться применить в ней смешанные классы, то она может вырасти в непонятного монстра и перестанет опознаваться. Таким образом пока буду рассматривать чисто абстрактную фабрику, состоящую из идеальных элементов.

Как видно, абстрактная фабрика состоит из абстрактных продуктов и самой абстрактной фабрики. И поскольку она применяет фундаментальный шаблон проектирования - интерфейс, помимо этого имеются классы конкретных продуктов и фабрик.

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

А теперь представим, что программист не удалил объекты продуктов или много раз получил к ним доступ. И правда, он не обязан знать тонкости реализации (одно из правил книги «Совершенный код»). Причём программист ведь даже не видит, что объект создаётся, он видит только открытую часть, а она называется получить - get (даже если было бы make, роли особой не играет), а не создать - create. Следовательно текущая реализация абстрактной фабрики уже требует исправления по нескольким пунктам.
atomicxp вне форума   Ответить с цитированием
Старый 07.11.2009, 21:33   #33
squilsmoism
Заблокирован
 
Регистрация: 29.10.2009
Сообщений: 2
Репутация: 10
По умолчанию Обсуждение шаблонов проектирования стереотипы

еще вопрос по теме задачи:
В голове крутится вариант без "Одиночки", т.е. класс прсто содержащий переменную uid обявленную как static, т.е. у всех классов она общая, краем уха слышал, что такой вариант чреват последствиями, но какими не знаю, может прояснишь?
squilsmoism вне форума   Ответить с цитированием
Старый 09.11.2009, 15:37   #34
ds.Dante
Профессионал
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Адрес: Москва
Сообщений: 2,997
Репутация: 1446
По умолчанию

Нюансов много. Например, если другой программист начнёт разбираться с кодом, он может насоздовать экземпляров класса, пока не поймёт что к чему. Синглтон исключает это (у него закрытый конструктор). Также синглтон имеет нормальный конструктор и деструктор.

В простых случаях лучше обойтись без паттернов.
ds.Dante вне форума   Ответить с цитированием
Старый 06.02.2010, 07:23   #35
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Адрес: Екатеринбург
Сообщений: 1,010
Репутация: 455
По умолчанию

Только сейчас эту тему обнаружил.
Интересная тема, только многое сперто с википедии)

С шаблонами лучше быть осторожнее, при неправильной реализации, могут возникнуть очень тяжелые последствия(например, все шаблоны которые связаны с runtime-полиморфизмом).
__________________
[B]ромик0:[/B] Cколько получают здешние модераторы?
[B]pu4koff:[/B] У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума   Ответить с цитированием
Старый 11.03.2017, 19:52   #36
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,339
Репутация: 3350

icq: 512-765
skype: alexp.frl
По умолчанию

Немного оживлю древнюю тему записью вебинара от бородатого гуру объясняющего суть паттернов

https://youtu.be/wX6BBaQZpzE?t=37s
Alex11223 вне форума   Ответить с цитированием
Старый 17.01.2018, 01:49   #37
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,339
Репутация: 3350

icq: 512-765
skype: alexp.frl
По умолчанию

Big Ball of Mud.
Описание паттернов применяемых при создании реального ПО

http://laputan.org/mud/
Alex11223 вне форума   Ответить с цитированием
Старый 20.01.2018, 10:39   #38
rrrFer
Санитар
Профессионал
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,595
Репутация: 972
По умолчанию

У меня ваша ссылка не открылась, но часть паттернов хорошо описана тут:
https://pro-prof.com/archives/catego...esign_patterns. От GoF отличается весьма сильно, но вообще акцент сделан на примеры.

Неплохо там описан синглетон (тут были споры по его поводу) - там как раз есть хороший пример его использования. В частности, синглетон используется для класса, отвечающего за работу с БД, но примеров там несколько.

Также там хороший пример для паттерна Фасад (а именно, фасад применяется для заворачивания классов для работы с базами данных в Qt в красивый фантик).

Паттерн Producer/Consumer описан на примере парсера сайта, Adapter и декоратор - на примере сетевого чата с фичами типа шифрования данных и т.п. (декоратор для сокета позволяет в рантайме навесить на сокет новые обязанности).

Это краткие "аннотации" на те материалы, что там есть, но не на все. Другие статьи мне нравятся, но не настолько чтобы я их вот так рекомендовал .
rrrFer вне форума   Ответить с цитированием
Старый 20.01.2018, 22:42   #39
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,339
Репутация: 3350

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
У меня ваша ссылка не открылась
чего-то лежал сайт, уже заработал.
Alex11223 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паттерны проектирования shinauri PHP 0 17.07.2012 17:06
Консольный текстовый редактор и паттерны delias C# (си шарп) 0 22.04.2011 00:41
паттерны для детсада pproger Общие вопросы по программированию, компьютерным наукам 4 11.04.2011 19:40
паттерны проектирования prokach Общие вопросы C/C++ 3 18.01.2011 23:23


09:29.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru