1. 程式人生 > >設計模式-原型模式-C++實現

設計模式-原型模式-C++實現

原型模式:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

場景:
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;
}

執行結果:
在這裡插入圖片描述