第9章《原型模式》

1、原型模式的规范定义:

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


2、原型模式的实质:

利用一个指定的对象实例,再创建一个同类型的对象实例,且这个新对象可以被定制,而且不需要知道创建的细节。


3、在java中的实现方式:

一个类只要实现了Cloneable()接口,就能作为原型被复制。当创建一个同类型的新实例时,可以通过调用这个类的clone()方法,实现新对象的创建及拷贝。


4、优势:

4.1、每次创建新对象时,不需要通过new来创建,节省了该类的构造方法执行时间,从而提升性能。

4.2、隐藏了实例的创建细节。


5、适用场景:

一般在初始化信息不发生改变的情况下,克隆是最好的方法。


6、UML图:



注意:在java中,Prototype这个抽象类是用不到的,因为java自己有Cloneable接口。任何实现了Cloneable接口的并在类中复写了public类型clone()方法的类,在调用clone()方法时,都会实现浅拷贝。如果一个类没有实现Cloneable接口,在调用clone()方法时,会报错。这一点可以查看Cloneable接口的说明。


7、模拟例子:

7.1、UML图


7.2、code:

依次为:Client,Resume,WorkExperience

package designmodel.ninthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/7 11:49
 * @ProjectName: JavaBaseTest
 */
public class Client {
    public static void main(String[] args) {
        Resume resume1=new Resume("李沁");
        resume1.setSelfInfo("女",22);
        resume1.setWorkExperience("北京",11,"技术研发");
        resume1.print();

        //原型模式的使用:根据指定对象resume1创建同类型的新对象resume2,且对对象的创建做定制,定制通过两个set方法完成.
        Resume resume2=(Resume)resume1.clone();
        resume2.setSelfInfo("女",25);
        resume2.setWorkExperience("天津",9,"技术支持");
        resume2.print();

        //clone()方法对引用的拷贝是浅拷贝
        resume1.print();
    }
}
package designmodel.ninthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/7 11:49
 * @ProjectName: JavaBaseTest
 */
public class Resume  implements Cloneable{
    private String name;
    private String sex;
    private int age;
    private WorkExperience experience;

    Resume(String name){
        this.name=name;
        experience=new WorkExperience();
    }

    @Override
    public Object clone() {
        return this;
    }



    //设置个人信息
    public void setSelfInfo(String sex,int age){
        this.sex=sex;
        this.age=age;
    }

    //设置工作经历
    public void setWorkExperience(String location,int time,String job){

        experience.setWorkSpace(location);
        experience.setStayTime(time);
        experience.setJob(job);
    }

    //打印简历信息
    public void print(){
        System.out.println("name:"+name);
        System.out.println("sex:"+sex);
        System.out.println("age:"+age);
        System.out.println("workSpace: 工作地点:"+experience.getWorkSpace()+",工作时长(年):"+experience.getStayTime()+",岗位:"+experience.getJob());
    }
}
package designmodel.ninthchapter;

/**
 * @Author: cxh
 * @CreateTime: 18/1/7 11:50
 * @ProjectName: JavaBaseTest
 */
public class WorkExperience {
    private String workPlace;
    private int stayTime;
    private String job;

    public void setWorkSpace(String workSpace) {
        this.workPlace = workSpace;
    }

    public void setStayTime(int stayTime) {
        this.stayTime = stayTime;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getWorkSpace() {
        return workPlace;
    }

    public int getStayTime() {
        return stayTime;
    }

    public String getJob() {
        return job;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值