原型模式是在运行时创建一个基于现有对象的克隆。这意味着可以复制一个对象,而无需显式地指定其类。这对于创建相似对象的情况非常有用,尤其是在对象的创建过程比较昂贵或复杂的情况下。原型模式的实现方式是通过实现一个 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 方法,这可能会破坏封装性。
对象的属性必须是可复制的,这可能会对性能产生影响。