【注意】最后更新于 December 20, 2017,文中内容可能已过时,请谨慎使用。
本篇来说一说java设计模式之原型模式。
本篇也是创建者模式的最后一篇了。也是看起来最简单的一篇。
就一句话!就是一个作业抄起来太复杂了,即使给你别人写好的照着抄也不想写一遍!
那怎么办?
复印啊!很简单嘛。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
package top.txiner.prototype;
public class Homework implements Cloneable{
private String title;
private String content;
public Homework() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Homework{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
@Override
protected Homework clone() throws CloneNotSupportedException {
return (Homework)super.clone();
}
}
|
看,连复印这个机器java都给创建好了,直接写clone方法就好了。当然了,你不implements Clonable接口也可以,因为是默认继承Object的。
直接在作业里面抄上去!
1
2
3
4
5
6
7
8
9
10
11
12
|
package top.txiner.prototype;
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Homework xiaomingChinese=new Homework();
xiaomingChinese.setTitle("Chinese homework");
xiaomingChinese.setContent("I love nature");
Homework xiaogangChinese=xiaomingChinese.clone();
System.out.println(xiaogangChinese);
System.out.println(xiaomingChinese);
}
}
|
完美!
后来,小明不干了,凭什么我千辛万苦写的作业要给你啊!我要加自己的信息,网作业里面标记上我的名字。
于是,作业变成了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package top.txiner.prototype;
public class Homework implements Cloneable{
private String title;
private String content;
private User writer;
public Homework() {
writer=new User();
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void setWriter(String name) {
this.writer.setName(name);
}
public User getWriter() {
return writer;
}
@Override
public String toString() {
return "Homework{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
", writer=" + writer +
'}';
}
@Override
protected Homework clone() throws CloneNotSupportedException {
return (Homework)super.clone();
}
}
public class User {
private String name;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
|
小刚还想抄
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Homework xiaomingChinese=new Homework();
xiaomingChinese.setTitle("Chinese homework");
xiaomingChinese.setContent("I love nature");
xiaomingChinese.setWriter("xiaoMing");
Homework xiaogangChinese=xiaomingChinese.clone();
xiaogangChinese.setWriter("xiaoGang");
System.out.println(xiaogangChinese);
System.out.println(xiaomingChinese);
}
}
|
一看,不好,这下虽然设置了自己的名字,但是在复印的时候还会覆盖前面的东西!(引用的对象--用户是同一个)赶快找补救办法!
有了!深拷贝!
我在复印的时候注意点,遇到这种信息改好了再复印!
于是乎
1
2
3
4
5
6
7
|
public Homework deepCLone(){
Homework copy=new Homework();
copy.setTitle(this.title);
copy.setContent(this.content);
copy.setWriter(this.writer.getName());
return copy;
}
|
恩,很不错,是自己的信息了!
可是这样太针对了!必须得知道引用的对象,然后再重新构造,好麻烦的!
有的时候,只需要一个新的对象,里面并不一定含有个人的信息,那好办啊!直接序列化称流,然后再读出来就好啦!
1
2
3
4
5
6
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
|
这样以后抄作业,不,开发项目就简单多了!