用原型實例指定建立物件的種類,並且透過複製這些原型建立新的物件。

C++ 無原生虛擬建構子,但透過 Clone() 虛擬函數達到同等效果:
Clone()。Clone() 回傳 new ConcretePrototype(*this)(複製建構子)。Prototype*,呼叫 Clone() 獲取新物件,不知具體型別。#ifndef PROTOTYPE_H
#define PROTOTYPE_H
class Prototype {
public:
Prototype() {}
virtual ~Prototype() {}
virtual Prototype* Clone() = 0;
};
class ConcretePrototype1 : public Prototype {
public:
ConcretePrototype1();
ConcretePrototype1(const ConcretePrototype1&);
virtual ~ConcretePrototype1();
virtual Prototype* Clone();
};
class ConcretePrototype2 : public Prototype {
public:
ConcretePrototype2();
ConcretePrototype2(const ConcretePrototype2&);
virtual ~ConcretePrototype2();
virtual Prototype* Clone();
};
#endif
#include "Prototype.h"
#include <iostream>
ConcretePrototype1::ConcretePrototype1() { std::cout << "construction of ConcretePrototype1\n"; }
ConcretePrototype1::~ConcretePrototype1() { std::cout << "destruction of ConcretePrototype1\n"; }
ConcretePrototype1::ConcretePrototype1(const ConcretePrototype1&) { std::cout << "copy construction of ConcretePrototype1\n"; }
Prototype* ConcretePrototype1::Clone() { return new ConcretePrototype1(*this); }
ConcretePrototype2::ConcretePrototype2() { std::cout << "construction of ConcretePrototype2\n"; }
ConcretePrototype2::~ConcretePrototype2() { std::cout << "destruction of ConcretePrototype2\n"; }
ConcretePrototype2::ConcretePrototype2(const ConcretePrototype2&) { std::cout << "copy construction of ConcretePrototype2\n"; }
Prototype* ConcretePrototype2::Clone() { return new ConcretePrototype2(*this); }
#include "Prototype.h"
#include <cstdlib>
int main() {
Prototype* p1 = new ConcretePrototype1();
Prototype* p2 = p1->Clone(); // 複製 p1
Prototype* p3 = new ConcretePrototype2();
Prototype* p4 = p3->Clone(); // 複製 p3
delete p1; delete p2; delete p3; delete p4;
return 0;
}
std::unique_ptr<Prototype> 明確擁有權移轉。PrototypeFactory 管理原型註冊表(map<string, Prototype*>),Create(type) 呼叫 Clone()。