欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

创建型模式:原型模式

程序员文章站 2022-04-29 17:22:38
一、模式的定义与特点原型(Prototype)模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。原型模式优缺点见PPT​素材部分。二、模式的结构原型模式的克隆分为浅克隆和深克隆,Java中的Object类提供了浅克隆的clone()方法,具体原型类只要实现Cloneable接口就可实现对象的浅克隆,所以用Java实现原型模式很简单。原型模式包含以下主要角色:...

一、模式的定义与特点
原型(Prototype)模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。

原型模式优缺点见PPT​素材部分。

二、模式的结构
原型模式的克隆分为浅克隆和深克隆,Java中的Object类提供了浅克隆的clone()方法,具体原型类只要实现Cloneable接口就可实现对象的浅克隆,所以用Java实现原型模式很简单。

原型模式包含以下主要角色:
1、抽象原型类:规定了具体原型对象必须实现的接口。
2、具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
3、访问类:使用具体原型类中的 clone() 方法来复制新的对象。

原型模式结构图见图1-1
创建型模式:原型模式

图1-1 原型模式的结构图

三、原型模式的应用场景
1、对象之间相同或相似,即只是个别的几个属性不同的时候。
2、对象的创建过程比较麻烦,但复制比较简单的时候。

四、原型模式的扩展
原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器PrototypeManager类。
该类用HashMap保存多个复制的原型,Client类可以通过管理器的get(String id)方法从中获取复制的原型。
其结构图如图1-2所示。
创建型模式:原型模式

图1-2 带原型管理器的原型模式的结构图

五、模式的应用实例
创建型模式:原型模式

图1-3 示例代码结构图

具体原型类Resume.java:

package com.example.designpattern.prototype;

import androidx.annotation.NonNull;

/**
 * @author Administrator
 * @date 2020/7/20
 * 具体原型角色,实现了克隆功能
 *
 * clone()为Object类所有,此处让Cloneable接口扮演抽象类角色,示例中不再单独给出抽象类角色
 * (本例比较简单,具体参见PPT素材上的3种角色的示例代码)
 */
class Resume implements Cloneable {
    private String name;
    private int age;
    private String sex;
    private String tel;
    private String workExperience;

    public Resume(String name, int age, String sex, String tel, String workExperience) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.tel = tel;
        this.workExperience = workExperience;
    }

    public Resume(String name, int age, String sex, String tel) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.tel = tel;
    }

    public Resume() {
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

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

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getWorkExperience() {
        return workExperience;
    }

    public void setWorkExperience(String workExperience) {
        this.workExperience = workExperience;
    }

    @Override
    public String toString() {
        return "Resume{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", tel='" + tel + '\'' +
                ", workExperience='" + workExperience + '\'' +
                '}';
    }

    @NonNull
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

访问类Client.java:

package com.example.designpattern.prototype;

/**
 * @author Administrator
 * @date 2020/7/20
 * 客户或访问类角色
 */
class Client {

    public static void main(String[] args) {
        //传统方式
        Resume r1 = new Resume("张三", 20, "男", "13022220000");
        r1.setWorkExperience("2008-2012 某科技公司 开发工程师");

        Resume r2 = new Resume("张三", 20, "男", "13022220000");
        r2.setWorkExperience("2012-2014 某电商公司 销售经理");

        System.out.println(r1);
        System.out.println(r2);

        System.out.print("\n");

        /*
        * 使用原型模式
        * 实例prototype是将要被复制的类,即具体原型
        */
        Resume prototype = new Resume("李四原", 30, "女", "18033332222");
        try {
            //克隆得到的新对象
            Resume r3 = (Resume) prototype.clone();
            Resume r4 = (Resume) prototype.clone();

            r3.setWorkExperience("2000-2004 Google公司 CTO");
            r4.setWorkExperience("2004-2006 Amazon公司 CFO");

            System.out.println(prototype);
            System.out.println(r3);
            System.out.println(r4);
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

}

测试结果:
创建型模式:原型模式

图1-4 测试结果

六、PPT素材
创建型模式:原型模式

PPT-01

创建型模式:原型模式

PPT-02

创建型模式:原型模式

PPT-03

创建型模式:原型模式

PPT-04

创建型模式:原型模式

PPT-05

创建型模式:原型模式

PPT-06

创建型模式:原型模式

PPT-07

创建型模式:原型模式

PPT-08

创建型模式:原型模式

PPT-09

创建型模式:原型模式

PPT-10

创建型模式:原型模式

PPT-11

创建型模式:原型模式

PPT-12

本文地址:https://blog.csdn.net/ykmeory/article/details/107501573

相关标签: 设计模式