Prototype design patern

Каква е най-просто идеята?
Идеята е не да СЪЗДАВАМЕ нови инстанции на клас/класове, а да клонираме вече съществуващи ГОТОВИ обекти от съответните класове.

Например ако имаме обекти от даден клас, които са доста близки и се различават само например по едно, две неща, защо да правим нови инстанции на даденият клас? Клонираш обекта и задаваш само различните неща…

Или ако по една или друга причина нямаме достъп до класа, а само до готовият обект.

Как да постигнем това?
Първо, забраняваме __clone() метода на класа/класовете, които ще ползваме като прототипи.

Защо?
За да не позволяваме директно клониране на обектите по принцип, за да си напишем свой custom клонировач, който да клонира.

Следователно, понеже най-вероятно ще имаме повече от един такъв обект, който ще изпозваме за прототип, ще трябва да имеме и интерфейс, с който да задължим тези прототипи да имат такъв метод-клонровач. Демек, да го направим клонируем.

Но защо непременно интерфейс? Moже и абсклас, ако искаме да изнесем и капсулираме клонирането да е общо за всички клонирани, демек да става по един и същ начин.

Кои са „участниците“ в Prototype design pattern?

  1. Всички класове, които ще могат да бъдат клонирани трябва да имплементират общ интерфейс, който ще наречем Prototype.
  2. Те (отделните класове, които ще клонираме) ще наричаме ConcretePrototype, и те по задължение от горният интерфейс, ще имат метод който ще извършва самото клониране, например cloneMe() (демек, implements an operation for cloning itself)
  3. И разбира се Client, който ще изисква и използва тези клонинги, демек by asking a prototype to clone itself.

Демек, Клиентът казва на Конкретният прототип „клонирай се и ми дай клонинга си“, като му вика cloneMe()