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
AD

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

  • Result:50points,
  • Rating points-4
m

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

  • Result:80points,
  • Rating points4
m

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

  • Result:20points,
  • Rating points-10
Last comments
ИМ
Игорь МаксимовNov. 22, 2024, 11:51 a.m.
Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiOct. 31, 2024, 2:37 p.m.
Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEOct. 19, 2024, 8:19 a.m.
Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовOct. 5, 2024, 7:51 a.m.
Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5July 5, 2024, 11:02 a.m.
QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Now discuss on the forum
Evgenii Legotckoi
Evgenii LegotckoiJune 24, 2024, 3:11 p.m.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Nov. 15, 2024, 6:04 a.m.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectJune 4, 2022, 3:49 a.m.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimOct. 25, 2024, 9:10 a.m.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Follow us in social networks