原型模式是一种创建型模式,它通过复制一个已有对象来创建新的对象,而无需知道新对象的具体类型。
原型模型的结构:
下面是一个简单的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
,并让ConcretePrototype1
和ConcretePrototype2
类分别实现它,它们分别代表了我们要复制的两种对象。PrototypeFactory
类是工厂类,它管理着所有原型对象的集合,并提供了一些方法来获取原型对象和添加原型对象。在getPrototype
方法中,我们根据传入的类型字符串从原型集合中获取相应的原型对象,并调用其clone
方法来复制它。
面试中可能遇到的问题:
- 什么是原型模式?
原型模式是一种创建型模式,它允许我们通过复制一个已有对象来创建新的对象,而无需知道新对象的具体类型。
- 2原型模式的工作原理是什么?
原型模式通过将已有对象进行复制来创建新的对象,其中需要注意的是,对于复制出来的对象,它们的成员变量的值与原型对象是相同的,但是它们是不同的对象,拥有不同的内存地址。
- 3请给出一个使用原型模式的实例?
假设我们需要在程序中使用一个存储单元信息的类,我们可以先创建一个该类的原型对象,然后通过复制这个原型对象来创建新的存储单元对象,避免每次创建新的存储单元时都需要重新初始化对象的成员变量。
- 4原型模式的优点和缺点是什么?
优点:
- 可以避免重复的对象创建,提高对象的创建效率。
- 可以动态添加和删除原型对象。
- 可以简化对象的创建过程,避免过多的初始化操作。
缺点:
- 如果原型对象的初始化操作比较复杂,那么每次复制都会执行这些操作,导致性能下降。
- 原型模式需要深拷贝实现对象的复制,如果对象的成员变量存在指针,那么需要自己实现深拷贝,增加了开发的难度。
- 5在实现原型模式时,你需要注意哪些问题?
在实现原型模式时,需要注意以下问题:
- 需要实现对象的深拷贝,保证复制出来的对象与原型对象是不同的对象。
- 需要提供克隆方法,用于复制对象。
- 原型对象需要具有足够的通用性,以便能够被复制。
- 6原型模式和其他创建型模式有什么区别?
原型模式是一种基于复制的创建型模式,它通过复制已有对象来创建新的对象。而其他创建型模式则主要是通过类的继承、工厂方法、抽象工厂等方式来创建对象。另外,原型模式通常用于创建较为简单的对象,而其他创建型模式则适用于创建更加复杂的对象。
- 7原型模式和单例模式有什么区别?
原型模式和单例模式都属于创建型模式,但是它们的目的和应用场景不同。原型模式的主要目的是通过复制已有对象来创建新的对象,而单例模式的主要目的是确保某个类只有一个实例。另外,原型模式可以创建多个对象,每个对象的成员变量的值都可以不同,而单例模式则只能创建一个对象,该对象的成员变量的值是唯一的。
- 8在实际项目中,你使用过原型模式吗?可以分享一下经验吗?
我曾在一个银行系统项目中使用过原型模式。在该项目中,我们需要创建多个账户对象,这些账户对象的属性都是相似的,只是账户名称、账户余额等信息有所不同。为了避免重复的对象创建,我们使用了原型模式来创建账户对象。我们首先创建一个账户原型对象,然后通过复制该对象来创建新的账户对象,避免了重复的初始化操作。使用原型模式不仅提高了对象的创建效率,而且也简化了代码的实现,提高了代码的可读性。