php做网站优点,做自由行的网站好,推广技术,教做饮品的网站如果对象的创建成本比较大#xff0c;而同一个类的不同对象之间差别不大#xff08;大部分字段都相同#xff09;#xff0c;在这种情况下#xff0c;我们可以利用对已有对象#xff08;原型#xff09;进行复制#xff08;或者叫拷贝#xff09;的方式来创建新对象而同一个类的不同对象之间差别不大大部分字段都相同在这种情况下我们可以利用对已有对象原型进行复制或者叫拷贝的方式来创建新对象以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式Prototype Design Pattern简称原型模式。
如果对象中的数据需要经过复杂的计算才能得到比如排序、计算哈希值或者需要从 RPC、网络、数据库、文件系统等非常慢速的 IO 中读取这种情况下我们就可以利用原型模式从其他已有对象中直接拷贝得到而不用每次在创建新对象的时候都重复执行这些耗时的操作。
建造者模式的实现
说明
原型模式的核心是一个抽象原型类Prototype该类定义了克隆方法clone用于复制自身并创建新对象。具体的原型类Concrete Prototype继承自抽象原型类并实现了克隆方法。
需要注意的是在 Java 中使用原型模式进行对象克隆时通常需要实现 Cloneable 接口并重写 clone() 方法来实现深层克隆。否则默认的 clone() 方法只会进行浅层克隆即复制对象的引用而不是实际数据。如果对象包含引用类型的成员变量则需要对这些成员变量也进行克隆操作以保证克隆对象与原始对象之间的数据独立性。
编程示例
// 抽象原型类
public abstract class Prototype implements Cloneable {// 定义克隆方法public abstract Prototype clone();
}// 具体原型类A
public class ConcretePrototypeA extends Prototype {// 实现克隆方法Overridepublic Prototype clone() {return new ConcretePrototypeA();}
}// 具体原型类B
public class ConcretePrototypeB extends Prototype {// 实现克隆方法Overridepublic Prototype clone() {return new ConcretePrototypeB();}
}// 客户端
public class Client {public static void main(String[] args) {Prototype prototypeA new ConcretePrototypeA(); // 创建原型对象APrototype cloneA prototypeA.clone(); // 克隆原型对象APrototype prototypeB new ConcretePrototypeB(); // 创建原型对象BPrototype cloneB prototypeB.clone(); // 克隆原型对象B}
}抽象原型类 Prototype 定义了克隆方法 clone()具体原型类 ConcretePrototypeA 和 ConcretePrototypeB 分别继承自抽象原型类并实现了克隆方法。客户端通过实例化具体原型类来创建原型对象然后通过调用克隆方法 clone() 复制该对象并创建新的对象。
深度拷贝的另外一种实现方法
public Object deepCopy(Object object) {ByteArrayOutputStream bo new ByteArrayOutputStream();ObjectOutputStream oo new ObjectOutputStream(bo);oo.writeObject(object);ByteArrayInputStream bi new ByteArrayInputStream(bo.toByteArray());ObjectInputStream oi new ObjectInputStream(bi);return oi.readObject();
}以上内容基于GPT创建和整理。
参考
设计模式之美-王争