Evgenii Legotckoi
Evgenii LegotckoiSept. 19, 2018, 10:27 a.m.

Generative Design Patterns - Prototype

Goals

  • Specify the types of objects to create using the prototype instance and create new objects by copying this prototype.
  • Create one instance of the class to use as the source for all future instances.
  • The new operator is considered harmful

Problems

An application is hard-wired to an object's class when using the new operator.


Discussion

Declare an abstract base class that defines a pure virtual method "clone" and maintains a dictionary of all "cloned" concrete derived classes. Any class that needs the "polymorphic constructor" capability: derives from an abstract base class, registers its prototypical instance, and implements the clone() operation.

The client then, instead of writing code that calls the new operator on the derived class name, invokes the "clone" operation on the abstract base class, providing a string or numbered data type that denotes the particular derived class desired.

Structure

The Factory knows how to find the right prototype, and each Class knows how to spawn new instances of itself.

Example

The Prototype template specifies the type of objects created using the prototype. Prototypes of new products are often built before full production, but in this example the prototype is passive and does not participate in copying. Mitotic cell division resulting in two identical cells is an example of a prototype that plays an active role in copying and thus exhibits a prototype pattern. When a cell splits, two identical genotype cells appear. In other words, the cell clones itself.

Control List

  1. Add "clone" method to existing class hierarchy
  2. Create a "registry" that maintains a cache of prototype objects. The registry can be encapsulated in a new Factory class or in a base class.
  3. Create a factory method that: may (or may not) take arguments, find the correct prototype object, call clone() on that object, and return the result.
  4. The client replaces all calls to the new operator with calls to the factory method.

Rules of thumb

  • Sometimes the creation patterns are competitors: there are times when you can use Prototype or Abstract Factory. In other cases, they complement each other: An Abstract Factory can store a set of prototypes from which objects can be cloned and returned. Abstract Factory, Builder and Prototype can use Singleton in their implementations.
  • Abstract Factory classes are often implemented using Factory Methods, but they can be implemented using Prototype.
  • Factory method: creation through inheritance. Prototype: creation via delegation.
  • Often projects start with Factory Method (less complex, customizable, subclasses proliferate) and evolve towards Abstract Factory, Prototype, or Builder (more flexible, more complex) as the developer finds more flexibility is needed.
  • The prototype does not require subclasses, but it does require an "initialize" operation. A factory method requires subclassing but does not require initialization.
  • Constructs that often use the Composite and Decorator patterns can often also use Prototype.
  • The prototype creates one instance of the class to be used as the creator of all future instances.
  • Prototypes are useful when object initialization is expensive and you expect minor changes to initialization parameters. In this context, Prototype can avoid costly "building from scratch" and support cheap cloning of a pre-initialized prototype.
  • Prototype is unique among other creation patterns because it doesn't require a class - just an object. Object-oriented languages such as Self and Omega, which do away with classes, rely entirely on prototypes to create new objects.
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Дмитрий

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
Дмитрий

C++ - Тест 003. Условия и циклы

  • Result:92points,
  • Rating points8
d
  • dsfs
  • April 26, 2024, 3:56 a.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:80points,
  • Rating points4
Last comments
k
kmssrFeb. 8, 2024, 5:43 p.m.
Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVADec. 25, 2023, 9:30 a.m.
Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJoDec. 25, 2023, 7:38 a.m.
Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
GvozdikDec. 18, 2023, 8:01 p.m.
Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Now discuss on the forum
G
George13May 6, 2024, 11:27 p.m.
добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
BlinCT
BlinCTMay 5, 2024, 4:46 a.m.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
PS
Peter SonMay 3, 2024, 4:57 p.m.
Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
Evgenii Legotckoi
Evgenii LegotckoiMay 2, 2024, 1:07 p.m.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderCheApril 30, 2024, 3:22 a.m.
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

Follow us in social networks