当先锋百科网

首页 1 2 3 4 5 6 7

前言:

原型模式(Prototype Pattern)是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

一.原型模式简介:

原型模式就是通过一个对象来创建对象,隐藏了创建细节。

模型模式主要应用的是对象的深复制,即对象的克隆。如果不了解,请先学习深复制和浅复制,点击查看

二.原型模式的实现:

案例:招聘网站的简历中心可以通过一份简历创建另一份简历,新简历会自动填入个人基本信息。

1.UML模型图:
这里写图片描述

2.模型类(简历类)

此类为一个标准的JavaBean类,只不过在此基础上实现了Cloneable接口,并实现clone()方法,用来深复制简历。

package com.pattern.prototype;

//简历类(模型类)
public class Resume implements Cloneable {

    private String name;
    private String age;
    private String sex;
    private String company;
    private String workTime;


    public Resume(String name) {
        super();
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getWorkTime() {
        return workTime;
    }

    public void setWorkTime(String workTime) {
        this.workTime = workTime;
    }

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

    //设置工作经验
    public void setWorkExperence(String workTime, String company) {
        this.workTime = workTime;
        this.company = company;
    }

    //简历预览
    public void show() {
        System.out.println("姓名:"+name+",性别:"+sex+",年龄:+age+",工龄:"+workTime+",所在公司:"+company);
    }

    // 实现克隆方法,用于对象克隆
    @Override
    public Object clone() throws CloneNotSupportedException {
        Resume resume = null;
        try {
            resume = (Resume) super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resume;
    }
}

3.客户端类

在客户端中,通过firstResume创建出secondResume、thirdResume这两个对象,而不是通过new,减少了通过new创建对象时,初始化构造函数时间消耗,提高效率。

模型模式还隐藏了对象创建的具体细节,提高性能。

package com.pattern.prototype.client;

import com.pattern.prototype.Resume;

public class Client {
    public static void main(String[] args) {
        try {
            Resume firstResume = new Resume("程猿");
            firstResume.setPersonalInfo("25", "男");
            firstResume.setWorkExperence("2014-2017", "特斯拉");

            Resume secondResume = (Resume) firstResume.clone();
            Resume thirdResume = (Resume) firstResume.clone();

            thirdResume.setWorkExperence("2014-2018", "皮克斯");

            firstResume.show();
            secondResume.show();
            thirdResume.show();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

    }
}

运行结果:

姓名:程猿,性别:男,年龄:25,工龄:2014-2017,所在公司:特斯拉
姓名:程猿,性别:男,年龄:25,工龄:2014-2017,所在公司:特斯拉
姓名:程猿,性别:男,年龄:25,工龄:2014-2018,所在公司:皮克斯

通过结果可以看出,我们修改了thirdResume对象(第三份简历),但不会对其他简历(对象firstResume和secondResume)造成影响。通过第一份填写好的简历模板,快速创建多份简历,各个简历之间互不影响,这就是原型模式的常用的应用。

原型模式也经常应用在对数据集的克隆和定制,如新闻客户端导航栏目的定制等。

总结:

  1. 模板模式主要利用了克隆对象(深复制)的方式创建对象,既隐藏创建对象的过程,又节省了资源消耗。
  2. 模板模式不用重新初始化对象,而是动态的获得对象运行时的状态。