大话设计模式_原型模式(Java代码)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率

Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制

代码如下:

WorkExperience类:


 1 package com.longsheng.prototype;
2
3 public class WorkExperience {
4
5 private String workDate;
6 private String workCompany;
7
8 public WorkExperience(String workDate, String workCompany) {
9 this.workDate = workDate;
10 this.workCompany = workCompany;
11 }
12
13 public String getWorkDate() {
14 return workDate;
15 }
16
17 public void setWorkDate(String workDate) {
18 this.workDate = workDate;
19 }
20
21 public String getWorkCompany() {
22 return workCompany;
23 }
24
25 public void setWorkCompany(String workCompany) {
26 this.workCompany = workCompany;
27 }
28
29 }

Resume类:


 1 package com.longsheng.prototype;
2
3 public class Resume implements Cloneable {
4
5 private String name;
6 private String age;
7 private String sex;
8 private WorkExperience mWorkExperience;
9
10 public Resume( String name ) {
11 this.name = name;
12 }
13
14 public String getName() {
15 return name;
16 }
17
18 public void setName(String name) {
19 this.name = name;
20 }
21
22 public String getAge() {
23 return age;
24 }
25
26 public void setAge(String age) {
27 this.age = age;
28 }
29
30 public String getSex() {
31 return sex;
32 }
33
34 public void setSex(String sex) {
35 this.sex = sex;
36 }
37
38 public WorkExperience getmWorkExperience() {
39 return mWorkExperience;
40 }
41
42 public void setmWorkExperience(WorkExperience mWorkExperience) {
43 this.mWorkExperience = mWorkExperience;
44 }
45
46 public void display() {
47 System.out.println(name + " " + sex + " " + age);
48 System.out.println(mWorkExperience.getWorkDate() + " " + mWorkExperience.getWorkCompany());
49 }
50
51 protected Object clone() throws CloneNotSupportedException {
52 return super.clone();
53 }
54
55 }

客户端:


 1 package com.longsheng.prototype;
2
3 public class Client {
4
5 public static void main(String[] args) throws Exception {
6 Resume resumeA = new Resume("同学");
7 resumeA.setAge("25");
8 resumeA.setSex("男");
9 WorkExperience mWorkExperience = new WorkExperience("2011-2014", "XX公司");
10 resumeA.setmWorkExperience(mWorkExperience);
11 Resume resumeB = (Resume)resumeA.clone();
12 mWorkExperience.setWorkCompany("YY公司");
13 resumeA.display();
14 resumeB.display();
15 }
16
17 }

运行后得出结果:


1 同学 男 25
2 2011-2014 YY公司
3 同学 男 25
4 2011-2014 YY公司

由此可知super.clone()实现的是浅复制。

要想实现深复制,则可修改程序如下:

WorkExperience类(红色部分为修改的部分):


 1 package com.longsheng.prototype;
2
3 public class WorkExperience implements Cloneable {
4
5 private String workDate;
6 private String workCompany;
7
8 public WorkExperience(String workDate, String workCompany) {
9 this.workDate = workDate;
10 this.workCompany = workCompany;
11 }
12
13 public String getWorkDate() {
14 return workDate;
15 }
16
17 public void setWorkDate(String workDate) {
18 this.workDate = workDate;
19 }
20
21 public String getWorkCompany() {
22 return workCompany;
23 }
24
25 public void setWorkCompany(String workCompany) {
26 this.workCompany = workCompany;
27 }
28
29 @Override
30 protected Object clone() throws CloneNotSupportedException {
31 return super.clone();
32 }
33
34 }

Resume类(红色部分为修改的部分):


 1 package com.longsheng.prototype;
2
3 public class Resume implements Cloneable {
4
5 private String name;
6 private String age;
7 private String sex;
8 private WorkExperience mWorkExperience;
9
10 public Resume( String name ) {
11 this.name = name;
12 }
13
14 public String getName() {
15 return name;
16 }
17
18 public void setName(String name) {
19 this.name = name;
20 }
21
22 public String getAge() {
23 return age;
24 }
25
26 public void setAge(String age) {
27 this.age = age;
28 }
29
30 public String getSex() {
31 return sex;
32 }
33
34 public void setSex(String sex) {
35 this.sex = sex;
36 }
37
38 public WorkExperience getmWorkExperience() {
39 return mWorkExperience;
40 }
41
42 public void setmWorkExperience(WorkExperience mWorkExperience) {
43 this.mWorkExperience = mWorkExperience;
44 }
45
46 public void display() {
47 System.out.println(name + " " + sex + " " + age);
48 System.out.println(mWorkExperience.getWorkDate() + " " + mWorkExperience.getWorkCompany());
49 }
50
51 protected Object clone() throws CloneNotSupportedException {
52 Resume mResume = (Resume)super.clone();
53 mResume.setmWorkExperience((WorkExperience)this.getmWorkExperience().clone());
54 return mResume;
55 }//或者可以和书本类似,创建一个接收WorkExperience对象的构造器,在这个方法中先构造新对象,再设相应值,然后返回此新对象(如以下折叠的部分)
56
57 }

另外一种实现方法(Resume类)

 1 package com.longsheng.prototype;
2
3 public class Resume implements Cloneable {
4
5 private String name;
6 private String age;
7 private String sex;
8 private WorkExperience mWorkExperience;
9
10 public Resume( String name ) {
11 this.name = name;
12 }
13
14 public Resume( WorkExperience mWorkExperience ) throws Exception {
15 this.mWorkExperience = (WorkExperience)mWorkExperience.clone();
16 }
17
18 public String getName() {
19 return name;
20 }
21
22 public void setName(String name) {
23 this.name = name;
24 }
25
26 public String getAge() {
27 return age;
28 }
29
30 public void setAge(String age) {
31 this.age = age;
32 }
33
34 public String getSex() {
35 return sex;
36 }
37
38 public void setSex(String sex) {
39 this.sex = sex;
40 }
41
42 public WorkExperience getmWorkExperience() {
43 return mWorkExperience;
44 }
45
46 public void setmWorkExperience(WorkExperience mWorkExperience) {
47 this.mWorkExperience = mWorkExperience;
48 }
49
50 public void display() {
51 System.out.println(name + " " + sex + " " + age);
52 System.out.println(mWorkExperience.getWorkDate() + " " + mWorkExperience.getWorkCompany());
53 }
54
55 protected Object clone() throws CloneNotSupportedException {
56 Resume mResume = null;
57 try {
58 mResume = new Resume(this.mWorkExperience);
59 mResume.setName(this.getName());
60 mResume.setAge(this.getAge());
61 mResume.setSex(this.getSex());
62 } catch (Exception e) {
63 e.printStackTrace();
64 }
65 return mResume;
66 }
67
68 }

Resume

客户端代码不变,运行后的结果:


1 同学   男   25
2 2011-2014 YY公司
3 同学 男 25
4 2011-2014 XX公司

大话设计模式_原型模式(Java代码),布布扣,bubuko.com

时间: 2024-08-02 02:50:36

大话设计模式_原型模式(Java代码)的相关文章

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

大话设计模式_解释器模式(Java代码)

解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息.客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行) 大话设计模式中的截图: 代码例子: 假设HTML代码解释器: (1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY&g

大话设计模式_模板方法模式(Java代码)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 简单描述:多个类的行为是差不多的,只是某些局部不一样,则交由父类中抽象出这些子类中相同的部分,父类中定义出不同的部分的接口(方法),这些不同部分的方法则由子类去实现,通过多态,实现代码的重用 大话设计模式中的截图: 例子代码: AbstractClass类: 1 package com.longsheng.templatemethod; 2 3 public

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla

大话设计模式_建造者模式(Java代码)

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 简单描述:1个产品类(可有可无,关键是建造流程),1个抽象建造步骤类,多个具体建造子类(不同的类建造不同的产品),1个指挥者(用于规定建造流程),客户端指定需要建造的具体类型,由指挥者建造好之后,建造者子类返回对应产品给客户 大话设计模式中的截图: 例子代码: Product类: 1 package com.longsheng.builder; 2 3 public class Product { 4 5 pr

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

大话设计模式_组合模式(Java代码)

组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 简单描述:1个Composite类,里面持有一个容器成员,容器可以存入自身 大话设计模式中的截图: 代码例子: AbstractComponent类: 1 package com.longsheng.composite; 2 3 public abstract class AbstractComponent { 4 5 public abstract void addC

大话设计模式_命令模式(Java代码)

命令模式:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日记,以及支持可撤销的操作. 简单描述:1个Receiver,知道如何执行命令.1个抽象命令,持有一个Receiver的引用,命令的执行则调用Receiver的对应方法(具体命令具体调用相应的方法).1个Invoker,只有命令的引用(可以是一个或多个),接收命令,并且执行命令的执行方法.客户端知道Receiver.生成命令给Invoker,由Invoker去调用命令自己的执行方法 大话设计模式中的截

大话设计模式_桥接模式(Java代码)

合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承. 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立变化. 解释:即一个系统可以有多种分类实现,把没种分类独立出来,让他们可以独自变化,减少他们之间的耦合. 简单描述:1个Abstraction类,持有一个Implementor的引用,其方法中调用此Implementor引用的对应方法 大话设计模式中的截图: 代码例子: Abstraction类: 1 package com.longsheng.bridge; 2 3 publi