原型设计是一种创造性的设计模式,它允许您复制现有对象,而不会使您的类依赖于它们。
功能: 对象复制:通过复制现有对象而不是从头开始构建来创建新对象。 降低创建开销:避免频繁使用构造函数创建对象,提高创建对象的效率。 灵活性:可以动态添加或删除原型,允许运行时决定使用哪种对象类型。 用例:创建昂贵的对象:当创建对象的过程复杂且耗时,可以使用原型模式来避免重复的初始化工作。 类别是固定的,但对象是多样的:当您需要创建的对象类型是固定的,但对象的属性或组合存在多种变化时,您可以使用原型模式来构建一个新对象。 避免继承以创建子类:当您需要在运行时动态确定对象的类型时,使用原型模式可以避免创建大量子类。 假设您有一个对象,并且想要创建该对象的精确副本。 你会怎么做?首先,您必须创建同一类的新对象。 然后,您必须循环访问原始对象的所有字段,并将其值复制到新对象。
但有一个问题。 并非所有对象都可以以这种方式复制,因为对象的某些字段可能是私有的,并且从对象本身的外部看不到。 直接复制方法也存在问题。 由于您必须知道对象的类才能创建重复项,因此您的类将依赖于该类。 原型模式将克隆过程委托给克隆对象本身。 此模式为支持克隆的所有对象声明一个通用接口。 此接口允许您克隆对象,而无需将 ** 耦合到对象的类。 通常,此类接口仅包含一个克隆方法。
clone 方法的实现在所有类中都非常相似。 此方法创建当前类的对象,并将旧对象的所有字段值传输到新对象。 您甚至可以复制私有字段,因为大多数编程语言允许对象访问属于同一类的其他对象的私有字段。
支持克隆的对象称为原型。 当您的对象具有数十个字段和数百种可能的配置时,克隆它们可能是子类化的替代方法。
原型类必须定义一个替代构造函数,该构造函数接受该类的对象作为参数。 构造函数必须将类中定义的所有字段的值从传递的对象复制到新创建的实例。 如果要更改子类,则必须调用父构造函数,让超类处理其私有字段的克隆。 Prototype Registry 提供了一种访问常用原型的简单方法。 它存储一组准备复制的预生成对象。 最简单的原型注册表是名称 Prototype Hash Diagram。
简单来说,它提供了一个克隆接口,在接口中调用了复制构造函数,但需要注意的是,对于指针等成员变量,复制构造函数需要重载才能实现深度复制。
using std::string;prototype design pattern
intent: lets you copy existing objects without **your code dependent on
their classes.
enum type
prototype(string prototype_name)
prototype_name_(prototype_name)
virtual ~prototype()
virtual prototype *clone() const = 0;
virtual void method(float prototype_field)
concreteprototype1 is a sub-class of prototype and implement the clone method
in this example all data members of prototype class are in the stack. if you
h**e pointers in your properties for ex: string* name_ ,you will need to
implement the copy-constructor to make sure you h**e a deep copy from the
clone method
class concreteprototype1 : public prototype
notice that clone method return a pointer to a new concreteprototype1
replica. so, the client (who call the clone method) has the responsability
to free that memory. i you h**e smart pointer knowledge you may prefer to
use unique_pointer here.
prototype *clone() const override
class concreteprototype2 : public prototype
prototype *clone() const override
in prototypefactory you h**e two concrete prototypes, one for each concrete
prototype class, so each time you want to create a bullet , you can use the
existing ones and clone those.
class prototypefactory
be carefull of free all memory allocated. again, if you h**e smart pointers
knowelege will be better to use it here.
prototypefactory()
notice here that you just need to specify the type of the prototype you
want and the method will create from the object with this type.
prototype *createprototype(type type)
void client(prototypefactory &prototype_factory) ")
创建原型对象。
original = prototype(42)
使用原型模式进行对象复制。
clone1 = original.clone()
clone2 = original.clone()
修改复制对象的值。
clone1.value = 100
打印信息。
original.display() 输出: value: 42
clone1.display() 输出: value: 100
clone2.display() 输出: value: 42