Поведение дизайна прототипа в приведенном ниже коде - PullRequest
0 голосов
/ 26 апреля 2018

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

class Stooge {
public:
 virtual Stooge* clone() = 0;
 virtual void slap_stick() = 0;
};

class Curly : public Stooge {
public:
    Stooge*   clone() { return new Curly; }
    void slap_stick() {
      cout << "Curly: suffer abuse\n"; }
    };

    Stooge* Factory::s_prototypes[] = {
        0, new Larry, new Moe, new Curly
    };
    Stooge* Factory::make_stooge( int choice = 3 ) {
        return s_prototypes[choice]->clone();
    }

make_stooge в Factory создает два объекта илине?потому что

  • s_prototypes[choice] возвращает один объект, а
  • s_prototypes[choice]->clone() снова возвращает другой объект.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Это объявление массива (и, вероятно, он должен быть закрытым)

 Stooge* Factory::s_prototypes[] = {
        nullptr, new Larry, new Moe, new Curly
    };

Обратите внимание, что я заменил 0 на nullptr.Инициализируется экземплярами объектов.

clone () должен сделать копию объекта.Что не так в вашем случае.Вместо прототипа вы создали простую фабрику.это не обязательный метод в вашем конкретном случае, потому что вы можете реализовать его как конструктор копирования для Curly (также Мо и Ларри).

Он используется, когда тип создаваемых объектов определяетсяпрототипный экземпляр, который клонируется для создания новых объектов.Этот шаблон используется для:

Шаблон прототипа используется для

  • избегания подклассов создателя объекта в клиентском приложении, как это делает шаблон фабричного метода.
  • избегайте затрат, связанных с созданием нового объекта стандартным способом (например, с использованием ключевого слова 'new'), когда это слишком дорого для данного приложения.

В C ++ обычное содержимое ConcreteProtoType::clone()Метод будет

  return new ConcreteProtoType(*this);

Иногда с некоторым дополнительным кодом, необходимым для создания нового экземпляра по архитектуре.(Вызов методов инициализации? Новое выражение будет помещением нового с использованием пула памяти? Некоторое действие, которое мы не можем сделать в конструкторе, как вызов виртуального метода?)

Это требует определения конструктора копирования, еслиобъект не может быть скопирован (если это возможно, почему мы используем прототип?)

0 голосов
/ 26 апреля 2018

Это не так.

Stooge* Factory::s_prototypes[] = {
0, new Larry, new Moe, new Curly
};

Это ваше первое создание объекта.

Stooge* Factory::make_stooge( int choice = 3 ) {
return s_prototypes[choice]->clone();
}

Эта функция клонирует существующий объект, чтобы вернуть новый.В соответствии с примером кода здесь создается ровно один объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...