
有的时候,我们创建对象,需要耗费大量时间在一些资源型操作上,这个时候,我们就可以先创建出一个模板,然后每次创建的时候直接从模板复制即可,不用反复进行耗时的资源型操作。
python代码:
- import copy
-
- class ComplexObject:
- def __init__(self, data):
- # 资源型操作
- self.data = data
-
- def clone(self):
- # 复制
- return copy.deepcopy(self)
-
- # 创建原型对象
- obj1 = ComplexObject(data = "large data")
- # 创建新对象,直接拷贝原对象
- new_object = original_object.clone()

JAVA代码:
- // 1. 定义抽象原型类
- public abstract class Prototype implements Coneable {
- public abstract Prototype clone();
- }
- // 2. 定义具体原型类
- public class ConcretePrototype extends Prototype {
- private String data;
-
- public ConcretePrototype(String data) {
- this.data = data;
- }
-
- @Override
- public Prototype clone() {
- return new ConcretePrototype(this.data);
- }
-
- public String getData() {
- return data;
- }
- }
-
- // 3. 客户端代码
- public class Client {
- public static void main(String[] args) {
- // 创建原型对象
- Prototype original = new ConcretePrototype("原始对象");
-
- // 克隆原型对象
- Prototype clone = original.clone();
-
- // 输出克隆对象的数据
- System.out.println("Clone Data: " + ((ConcretePrototype) clone).getData());
- }
- }
- #include
- #include
- #include
- using namespace std;
-
- // 抽象原型类
- class Prototype {
- public:
- virtual Prototype* clone() const = 0;
- virtual string getDetails() const = 0;
- virtual ~Prototype() {}
- };
-
- // 具体矩形原型类
- class RectanglePrototype : public Prototype {
- private:
- string color;
- int width;
- int height;
- public:
- // 构造方法
- RectanglePrototype(const string& color, int width, int height) : color(color), width(width), height(height) {}
-
- // 克隆方法
- Prototype* clone() const override {
- return new RectanglePrototype(*this);
- }
-
- string getDetails() const override {
- return "Color: " + color + ", Width: " + to_string(width) + ", Height: " + to_string(height);
- }
- };
-
- // 客户端
- int main() {
- vector
rectangles; -
- // 读取需要创建的矩形数量
- int N;
- cin >> N;
-
- // 地区每个矩形的属性星系并创建矩形对象
- for (int i = 0; i < N; ++i) {
- string color;
- int width, height;
-
- cin >> color >> width >> height;
-
- // 创建原型对象
- Prototype* originalRectangle = new RectanglePrototype(color, width, height);
-
- // 将原型对象保存到向量中
- rectangles.push_back(originalRectangle);
- }
-
- // 克隆对象
- for (const auto& rectangle : rectangles) {
- Prototype* cloneRectangle = rectangle->clone();
- cout << cloneRectangle->getDetails() << endl;
-
- // 释放克隆对象的内存
- delete cloneRectangle;
- }
-
- // 释放原型对象的内存
- for (const auto& rectangle : rectangles) {
- delete rectangle;
- }
-
- return 0;
- }