一、概述
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
二、使用场景
1.当一个系统应该独立于它的产品创建、构成和表示时。
2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3.为了避免创建一个与产品类层次平行的工厂类层次时。
4.当一个类的实例只能有几个不同状态组合中的一种时。
在我们应用程序可能有某些对象的结构比较复杂,但是我们又需要频繁的使用它们,如果这个时候我们来不断的新建这个对象势必会大大损耗系统内存的,这个时候我们需要使用原型模式来对这个结构复杂又要频繁使用的对象进行克隆。所以原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。它主要应用与那些创建新对象的成本过大时。它的主要优点就是简化了新对象的创建过程,提高了效率,同时原型模式提供了简化的创建结构。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
三、参与者
1. Prototype 声明一个克隆自身的接口、实现一个克隆自身的操作。
2. Client 让一个原型克隆自身从而创建一个新的对象。
四、类图
五、代码示例
1.Prototype
/**
* @author zhipeng_Tong
*/
public class WorkExperience implements Cloneable{
private String date;
private String address;
public WorkExperience(String date, String address) {
this.date = date;
this.address = address;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "WorkExperience{" +
"date='" + date + '\'' +
", address='" + address + '\'' +
'}';
}
}
/**
* @author zhipeng_Tong
*/
public class Resume implements Cloneable{
private String name;
private int age;
private WorkExperience workExperience;
public Resume() {
}
public Resume(String name, int age, WorkExperience workExperience) {
this.name = name;
this.age = age;
this.workExperience = workExperience;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = null;
return super.clone();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public WorkExperience getWorkExperience() {
return workExperience;
}
public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
@Override
public String toString() {
return "Resume{" +
"name='" + name + '\'' +
", age=" + age +
", " + "\n\t" + "workExperience=" + workExperience +
'}';
}
}
2.Client
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("佟志鹏", 23,
new WorkExperience("2019", "al"));
System.out.println(resume);
System.out.println("-------------------------");
Resume clone = (Resume)resume.clone();
clone.setName("小明");
clone.setAge(12);
clone.setWorkExperience(new WorkExperience("2022", "ccut"));
System.out.println(clone);
}
}
Resume{name='路人甲', age=23,
workExperience=WorkExperience{date='2019', address='al'}}
-------------------------
Resume{name='小明', age=12,
workExperience=WorkExperience{date='2022', address='ccut'}}