不得不的创建型模式-原型模式

原型模式是一种创建型模式,它通过复制一个已有对象来创建新的对象,而无需知道新对象的具体类型。

原型模型的结构:

 下面是一个简单的C++实现原型模式的代码示例:

#include <iostream>
#include <string>
#include <unordered_map>

class Prototype {
public:
    virtual Prototype* clone() = 0;
    virtual void print() = 0;
    virtual ~Prototype() {};
};

class ConcretePrototype1 : public Prototype {
public:
    Prototype* clone() {
        return new ConcretePrototype1(*this);
    }
    void print() {
        std::cout << "ConcretePrototype1" << std::endl;
    }
};

class ConcretePrototype2 : public Prototype {
public:
    Prototype* clone() {
        return new ConcretePrototype2(*this);
    }
    void print() {
        std::cout << "ConcretePrototype2" << std::endl;
    }
};

class PrototypeFactory {
public:
    Prototype* getPrototype(std::string type) {
        if (prototypes.find(type) != prototypes.end()) {
            return prototypes[type]->clone();
        }
        return nullptr;
    }
    void addPrototype(std::string type, Prototype* prototype) {
        prototypes[type] = prototype;
    }
private:
    std::unordered_map<std::string, Prototype*> prototypes;
};

int main() {
    PrototypeFactory factory;

    ConcretePrototype1* prototype1 = new ConcretePrototype1();
    factory.addPrototype("Prototype1", prototype1);

    ConcretePrototype2* prototype2 = new ConcretePrototype2();
    factory.addPrototype("Prototype2", prototype2);

    Prototype* clone1 = factory.getPrototype("Prototype1");
    Prototype* clone2 = factory.getPrototype("Prototype2");

    clone1->print(); // 输出:ConcretePrototype1
    clone2->print(); // 输出:ConcretePrototype2

    delete prototype1;
    delete prototype2;
    delete clone1;
    delete clone2;

    return 0;
}

在上面的代码中,我们定义了一个抽象基类Prototype,并让ConcretePrototype1ConcretePrototype2类分别实现它,它们分别代表了我们要复制的两种对象。PrototypeFactory类是工厂类,它管理着所有原型对象的集合,并提供了一些方法来获取原型对象和添加原型对象。在getPrototype方法中,我们根据传入的类型字符串从原型集合中获取相应的原型对象,并调用其clone方法来复制它。

面试中可能遇到的问题:

  1. 什么是原型模式?

原型模式是一种创建型模式,它允许我们通过复制一个已有对象来创建新的对象,而无需知道新对象的具体类型。

  1. 2原型模式的工作原理是什么?

原型模式通过将已有对象进行复制来创建新的对象,其中需要注意的是,对于复制出来的对象,它们的成员变量的值与原型对象是相同的,但是它们是不同的对象,拥有不同的内存地址。

  1. 3请给出一个使用原型模式的实例?

假设我们需要在程序中使用一个存储单元信息的类,我们可以先创建一个该类的原型对象,然后通过复制这个原型对象来创建新的存储单元对象,避免每次创建新的存储单元时都需要重新初始化对象的成员变量。

  1. 4原型模式的优点和缺点是什么?

优点:

  • 可以避免重复的对象创建,提高对象的创建效率。
  • 可以动态添加和删除原型对象。
  • 可以简化对象的创建过程,避免过多的初始化操作。

缺点:

  • 如果原型对象的初始化操作比较复杂,那么每次复制都会执行这些操作,导致性能下降。
  • 原型模式需要深拷贝实现对象的复制,如果对象的成员变量存在指针,那么需要自己实现深拷贝,增加了开发的难度。
  1. 5在实现原型模式时,你需要注意哪些问题?

在实现原型模式时,需要注意以下问题:

  • 需要实现对象的深拷贝,保证复制出来的对象与原型对象是不同的对象。
  • 需要提供克隆方法,用于复制对象。
  • 原型对象需要具有足够的通用性,以便能够被复制。
  1. 6原型模式和其他创建型模式有什么区别?

原型模式是一种基于复制的创建型模式,它通过复制已有对象来创建新的对象。而其他创建型模式则主要是通过类的继承、工厂方法、抽象工厂等方式来创建对象。另外,原型模式通常用于创建较为简单的对象,而其他创建型模式则适用于创建更加复杂的对象。

  1. 7原型模式和单例模式有什么区别?

原型模式和单例模式都属于创建型模式,但是它们的目的和应用场景不同。原型模式的主要目的是通过复制已有对象来创建新的对象,而单例模式的主要目的是确保某个类只有一个实例。另外,原型模式可以创建多个对象,每个对象的成员变量的值都可以不同,而单例模式则只能创建一个对象,该对象的成员变量的值是唯一的。

  1. 8在实际项目中,你使用过原型模式吗?可以分享一下经验吗?

我曾在一个银行系统项目中使用过原型模式。在该项目中,我们需要创建多个账户对象,这些账户对象的属性都是相似的,只是账户名称、账户余额等信息有所不同。为了避免重复的对象创建,我们使用了原型模式来创建账户对象。我们首先创建一个账户原型对象,然后通过复制该对象来创建新的账户对象,避免了重复的初始化操作。使用原型模式不仅提高了对象的创建效率,而且也简化了代码的实现,提高了代码的可读性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值