프로토 타입 패턴의 목적은 "새로운"복제 및 피하기로 객체 생성에 드는 비용을 줄이는 것입니다.
그러나 그렇다고해서 개체 복제에만 패턴을 사용할 수있는 것은 아닙니다. 다른 중요한 고려 사항이 있습니다
은 프로토 타입 객체의 클래스가 Cloneable
마커 인터페이스를 구현 한 약간
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");
}
}
아, 그리고 귀하의 경우 차이가 서로 다른 유형의 페이지 배너 을 만들기 위해 원형 PageBanner 인스턴스를 사용하는 예입니다
위 패턴의 Wikipedia의 정의도 확인했습니다. 객체 캐시를 사용하지 않는다면 클래스가 인스턴스화되고 있다는 의미가 없다는 것에 동의합니다. –