프로토타입(Prototype) 모드 - Java 디자인 모드(5)
18878 단어 Java 디자인 모드
원형 모드 소개
프로토타입 모드(Prototype Pattern): 성능을 보장하면서 중복된 객체를 작성하는 데 사용됩니다.분류: 작성 모드.
이 모델은 현재 대상의 복제를 만드는 데 사용되는 원형 인터페이스를 실현했다.직접 대상을 만드는 대가가 비교적 클 때 이런 모델을 채택한다.예를 들어 하나의 대상은 높은 대가의 데이터베이스 조작 후에 만들어져야 한다.우리는 이 대상을 캐시해서 다음 요청에 복제를 되돌려주고 필요할 때 데이터베이스를 업데이트해서 데이터베이스 호출을 줄일 수 있다.
의도: 원형 실례로 창설 대상의 종류를 지정하고 이 원형을 복사해서 새로운 대상을 만듭니다.주요 해결: 운행 기간에 원형을 구축하고 삭제합니다.
역할 구조
추상 원형 클래스(Prototype): 클론 자체의 인터페이스를 선언합니다.특정 프로토타입 클래스(ConcretePrototype): 클론의 특정 작업을 수행합니다.클라이언트 클래스(Client): 원형을 복제하여 새로운 대상을 얻습니다.
구체적 실현
이미 있는 이력서를 통해 새로운 이력서를 복사하다.
단계1: 추상적 원형류를 실현한 구체적인 원형류를 제시한다.
/**
* CurriculumVitae( ), —— 。
* Cloneable—— , 。
* @author Administrator
*
*/
public class CurriculumVitae implements Cloneable {
private String name;
private String personalInfo;
private String ability;
private String other;
public CurriculumVitae(String name, String info, String ability, String other) {
this.name = name;
this.personalInfo = info;
this.ability = ability;
this.other = other;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPersonalInfo() {
return personalInfo;
}
public void setPersonalInfo(String personalInfo) {
this.personalInfo = personalInfo;
}
public String getAbility() {
return ability;
}
public void setAbility(String ability) {
this.ability = ability;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
@Override
public Object clone() {
CurriculumVitae cv = null;
try {
cv = (CurriculumVitae) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cv;
}
@Override
public String toString() {
return this.name + ":" + this.personalInfo + " [" + this.ability + "]" + " " + this.other;
}
public void show() {
System.out.println(this);
}
}
2단계: Client 클래스를 지정합니다.즉, 테스트 클래스입니다.public class Client {
public static void main(String[] args) {
System.out.println(" ");
CurriculumVitae cv = new CurriculumVitae(" ", " -20-182********", " Java", " ");
cv.show();
System.out.println(" ");
CurriculumVitae cvCopy = (CurriculumVitae) cv.clone();
cvCopy.show();
}
}
3단계: 결과를 검증합니다.
: -20-182******** [ Java]
: -20-182******** [ Java]
총결산
사용 시기:
이점:
보충(딥 클론 및 얕은 클론)
깊이 클론 및 얕은 클론 정보.간단히 말하면:
// :
/**
* CurriculumVitae( ), —— 。
* Cloneable—— , 。
* @author Administrator
*
*/
public class CurriculumVitae implements Cloneable {
private String name;
private String personalInfo;
private String ability;
private String other;
private Birthday birthday;
public CurriculumVitae(String name, String info, String ability, String other, Birthday birthday) {
this.name = name;
this.personalInfo = info;
this.ability = ability;
this.other = other;
this.birthday = birthday;
}
public Birthday getBirthday() {
return birthday;
}
public void setBirthday(Birthday birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPersonalInfo() {
return personalInfo;
}
public void setPersonalInfo(String personalInfo) {
this.personalInfo = personalInfo;
}
public String getAbility() {
return ability;
}
public void setAbility(String ability) {
this.ability = ability;
}
public String getOther() {
return other;
}
public void setOther(String other) {
this.other = other;
}
@Override
public Object clone() {
CurriculumVitae cv = null;
try {
cv = (CurriculumVitae) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cv;
}
@Override
public String toString() {
return this.name + "(" + this.birthday + "):" + this.personalInfo
+ " [" + this.ability + "]" + " " + this.other;
}
public void show() {
System.out.println(this);
}
}
/**
* Birthday
* @author Administrator
*
*/
public class Birthday {
private String year;
private String month;
private String day;
public Birthday(String year, String month, String day) {
this.year = year;
this.month = month;
this.day = day;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
@Override
public String toString() {
return this.year + "-" + this.month + "-" + this.day;
}
}
/**
*
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
System.out.print(" :");
CurriculumVitae cv = new CurriculumVitae(" ", " -20-182********", " Java", " ",
new Birthday("1996", "01", "01"));
cv.show();
System.out.print(" :");
CurriculumVitae cvCopy = (CurriculumVitae) cv.clone();
cvCopy.getBirthday().setYear("2000");
cvCopy.show();
System.out.print(" :");
cv.show();
}
}
//
: (1996-01-01): -20-182******** [ Java]
: (2000-01-01): -20-182******** [ Java]
: (2000-01-01): -20-182******** [ Java]
복제된 복사본을 수정한 후 복제본을 수정한 후 원본이 바뀌었다는 것을 알 수 있다. 복제할 때birthday의 인용만 복제하고 복제하지 않았기 때문에 복제본을 수정하면 원본에 영향을 미칠 수 있다는 뜻이다. 이것은 간단한 복제이다.원형 모델은 심복제다.어떻게 심층 클론을 실현합니까?//
//
/**
* CurriculumVitae
*
*/
@Override
public Object clone() {
CurriculumVitae cv = null;
try {
cv = (CurriculumVitae) super.clone();
cv.birthday = (Birthday) birthday.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cv;
}
/*
* Birthday 。 Cloneable , public class Birthday implements Cloneable
* clone 。
*/
@Override
public Object clone() {
Birthday birthday = null;
try {
birthday = (Birthday) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return birthday;
}
//
: (1996-01-01): -20-182******** [ Java]
: (2000-01-01): -20-182******** [ Java]
: (1996-01-01): -20-182******** [ Java]
사본의 수정이 원본에 영향을 주지 않고 목적을 달성했다는 것을 알 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 디자인 모드 재시작 - Mediator Pattern하나의 중개 대상으로 일련의 대상 상호작용을 봉인하면 중개자는 각 대상이 현식적으로 서로 인용할 필요가 없게 하고 결합을 느슨하게 하며 그들 간의 상호작용을 독립적으로 바꿀 수 있다. 추상적인 중개자: 동료류 대상에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.