原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
场景:
1.这个类对象并不是一开始创建的,而是在运行过程中创建的,这样比较适合原型模式;
2.当一个类的实例由不同的状态组合的情况下。建立相应数目的原型并克隆他们在合适的的装态下的实例。
定义好复制的接口,有一个学生类继承这个接口,然后创建一个学生实例,但是会有很多的学生,可以通过拷贝接口生产很多的学生实体,只要通过接口修改其中的某些属性即可完成一个新的学生对象的创建。
#include <stdio.h>
#include <string>
class Person {
public:
virtual Person* clone() = 0;
virtual void show() {
}
};
class Student : public Person {
public:
Student* clone() override {
Student* student = new Student;
student->setName(_name);
student->setAge(_age);
student->setSex(_sex);
return student;
}
void setName(std::string name) {
_name = name;
}
void setAge(int a) {
_age = a;
}
void setSex(int s) {
_sex = s;
}
void show()override {
printf("学生—姓名:%s 性别:%s 年龄:%d\n"
, _name.c_str()
, [](int s)->const char* {
return s == 0 ? "女" : "男";
}(_sex)
, _age);
}
private:
std::string _name;
int _age;
int _sex;
};
class Worker : public Person {
public:
Worker* clone() override {
Worker* student = new Worker;
student->setName(_name);
student->setAge(_age);
student->setSex(_sex);
return student;
}
void setName(std::string name) {
_name = name;
}
void setAge(int a) {
_age = a;
}
void setSex(int s) {
_sex = s;
}
void show()override {
printf("工人—姓名:%s 性别:%s 年龄:%d\n"
, _name.c_str()
, [](int s)->const char* {
return s == 0 ? "女" : "男";
}(_sex)
, _age);
}
private:
std::string _name;
int _age;
int _sex;
};
int main() {
Student* xiaoming = new Student;
xiaoming->setName("小明");
xiaoming->setAge(15);
xiaoming->setSex(1);
xiaoming->show();
Student* xiaoqiang = xiaoming->clone();
xiaoqiang->setName("小强");
xiaoqiang->setAge(16);
xiaoqiang->setSex(1);
xiaoqiang->show();
Student* xiaolan = xiaoming->clone();
xiaolan->setName("小兰");
xiaolan->setAge(15);
xiaolan->setSex(0);
xiaolan->show();
Worker* xiaowang = new Worker;
xiaowang->setName("小王");
xiaowang->setAge(32);
xiaowang->setSex(1);
xiaowang->show();
Worker* xiaoli = xiaowang->clone();
xiaoli->setName("小李");
xiaoli->setAge(30);
xiaoli->setSex(0);
xiaoli->show();
return 0;
}
运行结果: