Каква е най-просто идеята?
Идеята е не да СЪЗДАВАМЕ нови инстанции на клас/класове, а да клонираме вече съществуващи ГОТОВИ обекти от съответните класове.
Например ако имаме обекти от даден клас, които са доста близки и се различават само например по едно, две неща, защо да правим нови инстанции на даденият клас? Клонираш обекта и задаваш само различните неща…
Или ако по една или друга причина нямаме достъп до класа, а само до готовият обект.
Как да постигнем това?
Първо, забраняваме __clone() метода на класа/класовете, които ще ползваме като прототипи.
Защо?
За да не позволяваме директно клониране на обектите по принцип, за да си напишем свой custom клонировач, който да клонира.
Следователно, понеже най-вероятно ще имаме повече от един такъв обект, който ще изпозваме за прототип, ще трябва да имеме и интерфейс, с който да задължим тези прототипи да имат такъв метод-клонровач. Демек, да го направим клонируем.
Но защо непременно интерфейс? Moже и абсклас, ако искаме да изнесем и капсулираме клонирането да е общо за всички клонирани, демек да става по един и същ начин.
Кои са „участниците“ в Prototype design pattern?
- Всички класове, които ще могат да бъдат клонирани трябва да имплементират общ интерфейс, който ще наречем Prototype.
- Те (отделните класове, които ще клонираме) ще наричаме ConcretePrototype, и те по задължение от горният интерфейс, ще имат метод който ще извършва самото клониране, например cloneMe() (демек, implements an operation for cloning itself)
- И разбира се Client, който ще изисква и използва тези клонинги, демек by asking a prototype to clone itself.
Демек, Клиентът казва на Конкретният прототип „клонирай се и ми дай клонинга си“, като му вика cloneMe()