То, что вы говорите, отчасти верно в том смысле, что цель шаблона-прототипа - снизить стоимость создания объекта путем клонирования и избегания «нового».
Но это не значит, что вы можете использовать шаблон простоклонировать объекты.Существуют и другие важные соображения
- Использование объекта-прототипа в качестве «создателя» всех других экземпляров.
- Создание «почти» похожих экземпляров из данного экземпляра, прототип
Подводя итог, цель прототипа заключается в следующем:
- Сокращение затрат на создание объектов путем клонирования «объекта-прототипа»
- Когда объекты, созданные посредством прототипирования, будутнемного отличаться от объекта-прототипа.
Ниже приведен пример, в котором используется прототип экземпляра PageBanner для создания различных типов баннеров страниц, которые немного различаются
import java.awt.Dimension;
import java.io.Serializable;
/**
* This class also acts as a factory for creating prototypical objects.
*/
public class PageBanner implements Serializable, Cloneable {
private String slogan;
private String image;
private String font;
private Dimension dimension;
// have prototype banner from which to derive all other banners
private static final PageBanner PROTOTYPE = new PageBanner("",
"blank.png", "Verdana", new Dimension(600, 45));
PageBanner(String slogan, String image, String font,
Dimension dim) {
this.slogan = slogan;
this.image = image;
//... other assignments
}
// getters and setters..
public String toString() {
return new StringBuilder("PageBanner[")
.append("Slogan=").append(slogan)
.append("Image=").append(image)
.append("Font=").append(font)
.append("Dimensions=").append(dimension)
.toString();
}
protected Object clone() {
Object cln = null;
try {
cln = super.clone();
}catch(CloneNotSupportedException e) {
// ignore, will never happen
}
return cln;
}
/**
* This is the creational method that uses the prototype banner
* to create banners and changes it slightly (setting slogan and image)
*/
public static PageBanner createSloganBanner(String slogan, String image) {
PageBanner banner = (PageBanner) PROTOTYPE.clone();
banner.slogan = slogan;
banner.image = image;
return banner;
}
/**
* Another creational method that uses the prototype banner
* to create banners and changes it slightly (setting image)
*/
public static PageBanner createImageBanner(String image) {
PageBanner banner = (PageBanner) PROTOTYPE.clone();
banner.image = image;
return banner;
}
// similarly you can have a number of creational methods with
// different parameters for different types of banners that
// vary slightly in their properties.
// main... (for illustration)
public static void main(String[] args) {
// both these banners are created from same prototypical instance
PageBanner slogan = PageBanner.createSloganBanner(
"Stackoverflow Rocks", "stack.png");
PageBanner img = PageBanner.createImageBanner("stackBanner.png");
}
}
Да и в вашемслучай, пусть класс вашего объекта-прототипа реализует интерфейс маркера Cloneable