原型模式(Prototype)使用场景:
1):对象之间相同或相似,只有个别属性不同。
2):对象的创建过程比较麻烦,但是复制过程比较简单。
明白了使用场景让我们来看看什么是原型模式的定义,你大概或许猜到了一点,直白点就是复制原型对象创建一个和原型对象相同或者相似的对象。
模式的结构:原型对象包含了以下主要角色:
1):抽象原型类:规定了具体原型对象必须实现的的接口。
2):具体原型类:实现抽象原型类的clone()方法,它是一个可被复制的对象。
3):访问类:使用具体原型类中的clone()方法复制新的对象。
接下来就是具体代码的实现:由于原型模式的克隆是分为浅克隆和深克隆。下面我们分别来看看两种克隆模式的实现。
创建接口
public interface Prototype {
Prototype clone();
}
创建具体的克隆对象
import java.util.List;
public class ConcretePrototypeA implements Prototype{
private int age;
private String name;
private List hobbies;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getHobbies() {
return hobbies;
}
public void setHobbies(List hobbies) {
this.hobbies = hobbies;
}
@Override
public ConcretePrototypeA clone() {
ConcretePrototypeA concretePrototype = new ConcretePrototypeA();
concretePrototype.setAge(this.age);
concretePrototype.setName(this.name);
concretePrototype.setHobbies(this.hobbies);
return concretePrototype;
}
}
3.创建Client接口
public class Client {
private Prototype prototype;
public Client(Prototype prototype){
this.prototype=prototype;
}
public Prototype startClone(Prototype concretePrototype){
return (Prototype) concretePrototype.clone();
}
}
测试类
import java.util.ArrayList;
import java.util.List;
public class PrototypeTest {
public static void main(String[] args) {
//创建一个具体的需要克隆的对象
ConcretePrototypeA concretePrototype = new ConcretePrototypeA();
//填充属性方便测试
concretePrototype.setAge(15);
concretePrototype.setName("lisi");
List hobbies = new ArrayList<String>();
concretePrototype.setHobbies(hobbies);
System.out.println(concretePrototype);
//创建client对象,准备开始克隆
Client client = new Client(concretePrototype);
ConcretePrototypeA concretePrototypeClone = (ConcretePrototypeA)
client.startClone(concretePrototype);
System.out.println(concretePrototypeClone);
System.out.println("克隆对象中的引用类型地址值:" + concretePrototypeClone.getHobbies());
System.out.println("原对象中的引用类型地址值:" + concretePrototype.getHobbies());
System.out.println("对象地址比较:"+(concretePrototypeClone.getHobbies() ==
concretePrototype.getHobbies()));
}
}