实验6:原型模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解原型模式的动机,掌握该模式的结构;
2、能够利用原型模式解决实际问题。
[实验任务一]:向量的原型
用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。
实验要求:
1.画出对应的类图;
![](https://img2023.cnblogs.com/blog/2444024/202212/2444024-20221216105530109-1017567715.png)
2.提交源代码(用C++完成);
C++
#include "stdafx.h"
using namespace std;
class AbstractVector
{
public:
virtual AbstractVector*
Clone() const = 0;
virtual void showData()
= 0;
public:
double* len;//向量长度'
double begin;
double end;
};
class vector:public AbstractVector{
public:
vector(double beg, double en){
begin = beg;
end = en;
len =
new double;
if (end >=
begin)
*len = end - begin;
else
*len = begin - end;
}
vector(const vector&
cp){
int cho=0;
begin = cp.begin;
end = cp.end;
cout << "深克隆输入1,浅克隆选择2" << endl;
cin >> cho;
if (cho == 1){
len =
new double;
*len = *(cp.len);
}
else
len = cp.len;
}
void showData(){
cout << "向量的长度为" << *len<<endl;
}
AbstractVector*
Clone() const{
return new vector(*this);
}
~vector(){
delete len;
}
};
int _tmain(int argc,
_TCHAR* argv[])
{
AbstractVector* p =
new vector(0,10);
AbstractVector* p1 =
p->Clone();
cout << "p的长度为"; p->showData();
cout <<
"p1的长度为"; p1->showData();
if (p->len ==
p1->len){
cout << "这是浅克隆" << endl;
cout <<
"p->len的地址为" <<
p->len << endl;
cout <<
"p1->len的地址为" <<
p1->len << endl;
}
else{
cout << "这是深克隆" << endl;
cout <<
"p->len的地址为" <<
p->len << endl;
cout <<
"p1->len的地址为" <<
p1->len << endl;
}
system("pause");
return 0;
}
Java
package
prototypePattern;
import
java.io.Serializable;
public class
Attachment_2 implements Serializable {
private String name;
public String
getName() {
return name;
}
public void
setName(String name) {
this.name = name;
}
public void download() {
System.out.println("下载附件"+name);
}
}
package prototypePattern;
import
java.io.ByteArrayInputStream;
import
java.io.ByteArrayOutputStream;
import
java.io.IOException;
import
java.io.ObjectInputStream;
import
java.io.ObjectOutputStream;
import
java.io.OutputStream;
import
java.io.Serializable;
public class WeeklyLog_2 implements
Serializable{
private Attachment_2 attachment;
private String date;
private String name;
private String content;
public Attachment_2 getAttachment() {
return attachment;
}
public void setAttachment(Attachment_2
attachment) {
this.attachment = attachment;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public WeeklyLog_2 deepclone() throws
Exception {
ByteArrayOutputStream bao = new
ByteArrayOutputStream();
ObjectOutputStream oos = new
ObjectOutputStream(bao);
oos.writeObject(this);
ByteArrayInputStream bi = new
ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois = new
ObjectInputStream(bi);
return (WeeklyLog_2)ois.readObject();
}
}
package
prototypePattern;
public class Client_2
{
public static void main(String[] args)
{
WeeklyLog_2 log_1,log_2=null;
log_1 = new WeeklyLog_2();
Attachment_2 attachment = new
Attachment_2();
log_1.setAttachment(attachment);
try {
log_2=log_1.deepclone();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("周报对象是否相同"+(log_1==log_2));
System.out.println("附件对象是否相同"+(log_1.getAttachment()==log_2.getAttachment()));
}
}
3.注意编程规范。