(1)原型模式 (Prototype Pattern) 是一种创建型设计模式,是通过复制(克隆)现有对象来创建新对象的模式。它允许我们创建一个原型对象,然后通过复制该原型对象来创建新的对象,而无需通过实例化类来创建新的对象。
(2)在原型模式中,一个类将自身的实例作为原型,通过复制这个原型来创建新的对象。这个过程隐藏了对象的创建细节,而且可以提高创建对象的效率。
(3)原型模式基于对象的复制,可以分为浅拷贝和深拷贝两种形式:
(4)在实现原型模式时,通常需要实现一个 Cloneable
接口(或类似的机制),该接口标识类具有复制自己的能力。具体的实现细节则根据语言和框架的不同而有所差异。
(1)原型模式包含如下角色:
Java 中的 Object 类中提供了 clone()
方法来实现浅克隆。Cloneable
接口是上面的类图中的抽象原型类,而实现了 Cloneable
接口的子实现类就是具体的原型类。
Address.java
public class Address {
int id;
String addressName;
public Address(int id, String addressName) {
this.id = id;
this.addressName = addressName;
}
}
Person.java
public class Person implements Cloneable{
private int id;
private String name;
private Address address;
public String getName() {
return name;
}
public Person(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
System.out.println("具体的原型对象创建完成!");
}
@Override
protected Object clone() throws CloneNotSupportedException {
System.out.println("具体原型复制成功!");
return (Person) super.clone();
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", address=" + address +
'}';
}
}
Client.java
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person(1, "小华", new Address(1, "北京"));
Person person2 = (Person) person1.clone();
System.out.println("person1: " + person1);
System.out.println("person2: " + person2);
System.out.println("person1.getName() == person2.getName() 的结果为: " + (person1.getName() == person2.getName()));
System.out.println("person1 == person2 的结果为: " + (person1 == person2));
}
}
输出结果如下图所示:
先将 Address 类和 Person 类实现 Serializable
接口,然后再修改 Client.java 中的代码即可。
Client.java
public class Client {
public static void main(String[] args) throws Exception {
Person person1 = new Person(1,"小华",new Address(1,"北京"));
//创建对象输出流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\testData\\a.txt"));
//写对象
oos.writeObject(person1);
//释放资源
oos.close();
//创建对象输入流对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\testData\\a.txt"));
//读取对象
Person person2 = (Person) ois.readObject();
//释放资源
ois.close();
System.out.println("person1:"+person1);
System.out.println("person2:"+person2);
System.out.println("person1.getName() == person2.getName()的结果为:"+(person1.getName() == person2.getName()));
System.out.println("person1 == person2的结果为:"+(person1 == person2));
}
}
public class Person implements Cloneable {
private int id;
private String name;
private Address address;
public String getName() {
return name;
}
public Person(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
System.out.println("具体的原型对象创建完成!");
}
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("具体原型复制成功!");
Person person = null;
person = (Person)super.clone();
//对引用数据类型单独处理
person.name = new String(name);
person.address = (Address)address.clone();
return person;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", address=" + address +
'}';
}
}
(1)原型模式具有以下优点:
(2)原型模式也存在一些缺点:
(3)综上所述,原型模式在某些情况下可以提供高效、灵活和可扩展的对象创建方式,但使用时需注意克隆的实现细节和对象的复杂性。
(1)原型模式适用于以下场景:
(2)总的来说,原型模式适用于需要复制和创建新对象的场景,尤其是在对象的创建成本较高或初始化复杂的情况下,使用原型模式可以提高创建效率和灵活性。