本文适合新手和小白
目录
1、Prototpye
(1)意图
(2)结构
(3)适用性
2、根据UML类图写代码
(1)泛化关系
(2)关联关系
(3)模式分析
3、代码实现
1、Prototpye
(1)意图
用原型实力制定创建对象的种类,并且通过复制这些原型创建新的对象。
(2)结构
其中:Prototype声明一个复制自身的接口。
CocncretePrototype实现一个复制自身的操作
Client让一个原型复制自身从而创建新的对象
(3)适用性
一个系统要独立于它产品的创建、构成和表示时。//抽象工厂区分: 一个系统要独立与它的产品的创建、组合、表示时
当要实例化的类在运行时刻制定时,通过动态装载。
为了避免创建一个与产品类层次平行的工厂层次时。
当一个类的实例只能有几个不同状态组合中一种时。建立相应数目的原型并克隆他们可能比每次用合适的状态手工实例化更方便一些。
2、根据UML类图写代码
通过对流程图的观察,我们发现主要有2个关系,1个泛化关系另一个为实现关系。
(1)泛化关系
根据教材366页的解释。泛化是一种特殊/一般的关系,特殊元素(子元素)的对象可替代一般元的对象。用这种方法子元素共享了父元素的结构和行为。本例子中ConcretePrototype和Prototype就是这种关系。
(2)关联关系
根据教材描述,关联是一个中结构关系,她描述了一个组链,链是对象之间的连接。
我们可以将这个关系看做,一个类与另一个类之间有某种关联。它使一个类知道另一个类的属性和方法(实例变量体现)。A类依赖于B对象,并且把B作为A的一个成员变量, 则A和B存在关联关系.这种关联关系可以使用HAS-A表示。关联关系如果进行详细的划分,又可进一步分为单向关联、双向关联和自关联。本例子中Client和Prototype就是这层关系
class Client{
public:
Client(Prototype *prototype ){
this->prototype=prototype;
}
Prototype *prototype;//关联关系client将Prototype当成员变量使用,让clinet这个类知道Prototype这个类的属性和方法
};
(3)模式分析
通过我们对UML图的解读和分析,原型模式逻辑如下:
1、clinet下有个operation方法,通过关联关系知道 Prototype类下有个clone()方法。(关联关系)
2、Prototype本身是一个抽象类她只提供一个接口,她将clinet类的operation()方法传递出的p交给自己的子类ConcretePrototype1或者ConcretePrototype2中的clone()方法来成完成的。(泛化关系)
3、那么这个ConcretePrototype类中的clone()到底要干什么呢?根据注解(圆圈和横线)描述为 return copy of self(复制自身)。
结论: clinet使用operation方法调用Prototype实现对自身的复制。
3、代码实现
#include
using namespace std;
class Prototype{//声明一个复制自身的接口
public:
// Prototype(){}
virtual Prototype *clone()=0;
virtual void setage(int)=0;
virtual void setname(string)=0;
virtual void setgender(string)=0;
virtual void show()=0;
};
class ConcretePrototype:public Prototype{//实现一个复制自身的操作
public:
ConcretePrototype(){}
ConcretePrototype(ConcretePrototype *client){//复制构建,用于克隆
this->name=client->name;
this->age=client->age;
this->gender=client->gender;
}
ConcretePrototype(int age,string name ,string gender)
{//初构建
this->name=name;
this->age=age;
this->gender=gender;
}
void setage(int age){
this->age=age;
}
void setname(string name){
this->name=name ;
}
void setgender(string gender){
this->gender=gender;
}
void show(){
cout<<" name: "<clone();
}
Prototype *prototype;
};
int main(){
Prototype *a=new ConcretePrototype(25,"李四","女");//创建原型
Client *client=new Client(a);
a->show();//打印出李四女士的相关信息
Prototype *b=client->operation();//利用client 复制自身创建新对象
b->show();//复制后我们通过打印 b显示的依然是李四女士的信息 复制成功
b->setage(20);//对复制的对象属性就行一定的修改
b->setname("张三");
b->setgender("男");
b->show();//b显示的信息张三先生的信息
a->show();//为了确保修改了b会不会影响到a,通过打印a得到的依然是李四女士的信息,数据安全
delete a;
delete client;
delete b;
a=NULL;
client=NULL;
b=NULL;
return 0;
}
输出结果



