合肥企业建网站,seo网站推广收费,东莞公司网站建设公司,全国建筑业四库一平台原型模式#xff08;Prototype Pattern#xff09;
原型模式是一种创建型设计模式#xff0c;它允许你通过复制现有对象来创建新的对象#xff0c;而不是通过类实例化来创建对象。这种模式在开发时需要大量类似对象的情况下非常有用。原型模式的核心是一个具有克隆方法的接…原型模式Prototype Pattern
原型模式是一种创建型设计模式它允许你通过复制现有对象来创建新的对象而不是通过类实例化来创建对象。这种模式在开发时需要大量类似对象的情况下非常有用。原型模式的核心是一个具有克隆方法的接口通过实现该接口不同的对象可以被复制。
实际应用
在C中原型模式通常使用一个基类原型接口和具体实现类来实现。基类包含一个纯虚拟的克隆方法每个具体类实现该方法以返回自己的克隆。
克隆形状对象
假设我们有一个Shape基类和一些具体的形状类如Circle和Rectangle。
#include iostream
#include memory
#include unordered_map// Shape基类包含一个纯虚拟的克隆方法
class Shape {
public:virtual ~Shape() default;virtual std::unique_ptrShape clone() const 0;virtual void draw() const 0;
};// Circle类继承自Shape并实现克隆方法
class Circle : public Shape {
private:int radius;
public:Circle(int r) : radius(r) {}std::unique_ptrShape clone() const override {return std::make_uniqueCircle(*this);}void draw() const override {std::cout Drawing a Circle with radius radius \n;}
};// Rectangle类继承自Shape并实现克隆方法
class Rectangle : public Shape {
private:int width, height;
public:Rectangle(int w, int h) : width(w), height(h) {}std::unique_ptrShape clone() const override {return std::make_uniqueRectangle(*this);}void draw() const override {std::cout Drawing a Rectangle with width width and height height \n;}
};int main() {// 创建原型对象std::unordered_mapstd::string, std::unique_ptrShape prototypes;prototypes[circle] std::make_uniqueCircle(10);prototypes[rectangle] std::make_uniqueRectangle(20, 30);// 克隆对象std::unique_ptrShape shape1 prototypes[circle]-clone();std::unique_ptrShape shape2 prototypes[rectangle]-clone();// 绘制克隆的对象shape1-draw();shape2-draw();return 0;
}
克隆计算机对象
假设我们有一个Computer基类和一些具体的计算机类如Laptop和Desktop。
#include iostream
#include memory
#include unordered_map// Computer基类包含一个纯虚拟的克隆方法
class Computer {
public:virtual ~Computer() default;virtual std::unique_ptrComputer clone() const 0;virtual void display() const 0;
};// Laptop类继承自Computer并实现克隆方法
class Laptop : public Computer {
private:int batteryLife;
public:Laptop(int battery) : batteryLife(battery) {}std::unique_ptrComputer clone() const override {return std::make_uniqueLaptop(*this);}void display() const override {std::cout Displaying a Laptop with battery life batteryLife hours\n;}
};// Desktop类继承自Computer并实现克隆方法
class Desktop : public Computer {
private:bool hasMonitor;
public:Desktop(bool monitor) : hasMonitor(monitor) {}std::unique_ptrComputer clone() const override {return std::make_uniqueDesktop(*this);}void display() const override {std::cout Displaying a Desktop (hasMonitor ? with : without) monitor\n;}
};int main() {// 创建原型对象std::unordered_mapstd::string, std::unique_ptrComputer prototypes;prototypes[laptop] std::make_uniqueLaptop(8);prototypes[desktop] std::make_uniqueDesktop(true);// 克隆对象std::unique_ptrComputer comp1 prototypes[laptop]-clone();std::unique_ptrComputer comp2 prototypes[desktop]-clone();// 显示克隆的对象comp1-display();comp2-display();return 0;
}
克隆文档对象
假设我们有一个Document基类和一些具体的文档类如WordDocument和PDFDocument。
#include iostream
#include memory
#include unordered_map// Document基类包含一个纯虚拟的克隆方法
class Document {
public:virtual ~Document() default;virtual std::unique_ptrDocument clone() const 0;virtual void print() const 0;
};// WordDocument类继承自Document并实现克隆方法
class WordDocument : public Document {
private:int wordCount;
public:WordDocument(int words) : wordCount(words) {}std::unique_ptrDocument clone() const override {return std::make_uniqueWordDocument(*this);}void print() const override {std::cout Printing a Word Document with word count wordCount \n;}
};// PDFDocument类继承自Document并实现克隆方法
class PDFDocument : public Document {
private:int pageCount;
public:PDFDocument(int pages) : pageCount(pages) {}std::unique_ptrDocument clone() const override {return std::make_uniquePDFDocument(*this);}void print() const override {std::cout Printing a PDF Document with page count pageCount \n;}
};int main() {// 创建原型对象std::unordered_mapstd::string, std::unique_ptrDocument prototypes;prototypes[word] std::make_uniqueWordDocument(5000);prototypes[pdf] std::make_uniquePDFDocument(100);// 克隆对象std::unique_ptrDocument doc1 prototypes[word]-clone();std::unique_ptrDocument doc2 prototypes[pdf]-clone();// 打印克隆的对象doc1-print();doc2-print();return 0;
}
总结
每个原型类实现自己的克隆方法从而确保了对象的正确复制。