本篇来说一说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();

这样以后抄作业,不,开发项目就简单多了!