设计模式(005)创建型之原型模式

        原型模式是在运行时创建一个基于现有对象的克隆。这意味着可以复制一个对象,而无需显式地指定其类。这对于创建相似对象的情况非常有用,尤其是在对象的创建过程比较昂贵或复杂的情况下。原型模式的实现方式是通过实现一个 clone() 方法来实现。这个方法会创建一个对象的副本,并将其返回给调用者。在实现 clone()方法时,您需要确保所有的属性都被正确地复制,以避免出现意外的行为。

1、场景设计

实现场景:用原型模式clone一个对象

2、C++实现

原型模式通过克隆现有对象来创建新对象,而无需了解对象创建的详细过程。在 C++ 中,可以通过实现一个可克隆的基类来实现原型模式。

#include <iostream>
#include <string>

using namespace std;

//可克隆的基类
class Prototype {
    public:
        // 纯虚函数,返回一个克隆出的对象指针
        virtual Prototype* clone() const = 0;
        // 纯虚函数,用于打印对象信息
        virtual void print() const = 0;
};

//具体的原型类
class ConcretePrototype:public Prototype {
    public:
        ConcretePrototype(int id, std::string name) : id_(id), name_(name) {}
        ConcretePrototype(const ConcretePrototype& other) : id_(other.id_), name_(other.name_) {}

        // 克隆函数,返回一个新的 ConcretePrototype 对象指针
        Prototype* clone() const override {
            return new ConcretePrototype(*this);
        }

        // 打印函数,输出 ConcretePrototype 对象信息
        void print() const override {
            std::cout << "ConcretePrototype, id=" << id_ << ", name=" << name_ << std::endl;
        }

    private:
        int id_;
        std::string name_;
};

int main()
{
    // 创建原型对象
    Prototype* prototype = new ConcretePrototype(1, "Hello PrototypeDemo!");
    // 克隆原型对象,得到新的对象
    Prototype* clone = prototype->clone();
    // 输出对象信息
    prototype->print();
    clone->print();
    // 释放内存
    delete prototype;
    delete clone;
    return 0;
}

3、Java实现

Prototype.java
package creatingpattern.prototype;

public class Prototype implements Cloneable{
    private String name;

    public Prototype(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();
    }
}
PrototypeDemo.java
package creatingpattern.prototype;

public class PrototypeDemo {
    public static void main(String args[]) {
        Prototype prototype = new Prototype("Hello PrototypeDemo!");
        try {
            Prototype clone = prototype.clone();
            System.out.println(clone.getName());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

原型模式的优点包括:
可以动态地添加或删除属性,而无需更改源代码。
可以避免重复的构造函数调用,提高性能。
可以简化创建复杂对象的过程。
原型模式也有一些缺点:
在某些语言中,对象的克隆可能会受到限制,例如 Java 中的 final 关键字。
对象必须实现 clone 方法,这可能会破坏封装性。
对象的属性必须是可复制的,这可能会对性能产生影响。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值