プロトタイプモード
プロトタイプモデル(原型パターン)性能を確保しつつ、オブジェクトの複製を作成するために使用されます。デザインパターンのこのタイプのオブジェクトを作成するための最良の方法を提供し、スキーマを作成します属します。
利用シナリオ
1.クラスオブジェクトは、オブジェクトのプロトタイプモデルをメモリにコピーされるように、オブジェクトが最良の選択、新しい新しいダイレクトよりもはるかに優れた性能で、その場合にはされたプロトタイプの大規模な量を必要とする場合、複数のオブジェクト、原型パターンのより多くの明白な利点は、反射されました。
2.オブジェクトの初期化は、他の多くのデータが準備をオブジェクトまたは他のコンピューティング・リソースを複雑必要な場合は、プロトタイプモデルを使用することができます。
3.処理が発生するため、公開情報オブジェクトの大量、個別設定の小さなフィールドは、オブジェクトのコピーモードのプロトタイプのコピーを使用することができるときに必要とします。
プロトタイプ浅いコピーモード
参照フィールドは、オブジェクトのクラスに存在する場合、オブジェクトクラスのJavaクローン方法は、浅いコピーであり、基準フィールド内のオブジェクトの2つのコピーが同じオブジェクトを指します。
プロトタイプクラス
//原型类
public class HomeWork implements Cloneable{
private String student; //学生
private String teacher; //老师
private String content; //内容
public String getStudent() { return student; }
public void setStudent(String student) { this.student = student; }
public String getTeacher() { return teacher; }
public void setTeacher(String teacher) { this.teacher = teacher; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
@Override
public String toString() {
return "HomeWork"+super.toString()+"{" + "student='" + student + '\'' +
", teacher='" + teacher + '\'' + ", content='" + content + '\'' + '}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
継承は、先端Cloneableインタフェースによってクローニングし、クローニングを達成するために、親クローンメソッドをオーバーライドすることができます。
テストカテゴリ
//测试类
class Test {
public static void main(String[] args) throws CloneNotSupportedException {
List<HomeWork> homeWorks=new LinkedList<>(); //储存整个班级的所有作业
HomeWork homeWork=new HomeWork(); //创建一个作业模板
homeWork.setTeacher("me"); //设置模板的教师名称
homeWork.setContent("xxxx"); //设置作业内容
for(int a=0;a<5;a++) { //循环创建每个同学的作业
HomeWork homeWork1=(HomeWork) homeWork.clone(); //克隆作业模板
homeWork.setStudent("studnet"+a); //设置作业的学生
homeWorks.add(homeWork1);
}
}
}
深いコピーモードのプロトタイプを作成
ObjectクラスのJavaのcloneメソッドクラスオブジェクトの参照フィールドが引用されたフィールドはディープコピーを達成するためにコピーされることで、存在する場合には、浅いコピーです。
プロトタイプクラス
//原型类
class HomeWork implements Cloneable{
private String student; //学生
private String teacher; //老师
private String content; //内容
private Date limitDate; //截至时间,!对象引用
public String getStudent() { return student; }
public void setStudent(String student) { this.student = student; }
public String getTeacher() { return teacher; }
public void setTeacher(String teacher) { this.teacher = teacher; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public Date getLimitDate() { return limitDate; }
public void setLimitDate(Date limitDate) { this.limitDate = limitDate; }
@Override
public String toString() {
return "HomeWork"+super.toString()+"{" +
"student='" + student + '\'' +", teacher='" + teacher + '\'' +
", content='" + content + '\'' +", limitDate=" + limitDate + '}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
HomeWork homeWork = (HomeWork) super.clone(); //先克隆整体
homeWork.limitDate = (Date) limitDate.clone(); //再对象引用进行单独克隆
return homeWork;
}
}
オブジェクト全体を複製する最初のことで、その後、個々のクローンは、オブジェクト参照のフィールドの浅いクローンを避けるために。
テストカテゴリ
//测试类
class Test {
public static void main(String[] args) throws CloneNotSupportedException {
List<HomeWork> homeWorks=new LinkedList<>();
HomeWork homeWork=new HomeWork();
homeWork.setTeacher("me");
homeWork.setContent("xxxx");
homeWork.setLimitDate(new Date());
for(int a=0;a<5;a++) {
HomeWork homeWork1=(HomeWork) homeWork.clone();
homeWork.setStudent("studnet"+a);
homeWorks.add(homeWork1);
}
}
}