设计模式之原型设计模式

原型设计模式

原型设计模式的定义是原型实例指定对象的类型,通过拷贝这些原型来创建新的对象

原型设计的例子

以<>例子为例子:我们求职投简历,经历这一栏在投不同的公司需要修改,我们不要再去创建个人信息、工作经历,
通过拷贝来减少简历中对象的创建。

简历父类

package com.learn.java.javabase.designpattern.prototype;

import lombok.Data;

@Data
public class Resume implements Cloneable {
    private String id;

    @Override
    public Resume clone() throws CloneNotSupportedException {
        Resume resume = null;
        resume = (Resume) super.clone();
        return resume;
    }
}

简历的实现类

package com.learn.java.javabase.designpattern.prototype;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@AllArgsConstructor
@Slf4j
public class CloneResume01 extends Resume {
    private String name;
    private String age;
    private String year;
    private String workInfo;
    private Remark remark;

    //    public CloneResume01(Remark remark)
//    {
//        this.remark =remark.clone();
//    }
    public CloneResume01(String age, String name) {
        this.age = age;
        this.name = name;
    }

    public CloneResume01(String age, String name, Remark remark) {
        this.age = age;
        this.name = name;
        this.remark = remark;
    }

    public void setWorkInfo(String year, String workinfo) {
        this.year = year;
        this.workInfo = workinfo;
    }

    public void display() {
        log.info("name = {} ,age = {} , in year {}  {},remark ={}", name, age, year, workInfo, remark.toString());
    }

    @Override
    public CloneResume01 clone() {
        CloneResume01 cloneResume01 =null;
        try {
            cloneResume01 = (CloneResume01) super.clone();
            cloneResume01.setRemark(this.getRemark().clone());
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return cloneResume01;
    }
}

简历中的备注类Remark

备注类作为简历的一个属性,因为浅复制只能复制String等基础数据类型的值,但对于其他的引用类型并没有拷贝值,只传递对象的引用地址
因此重写Remark类的clone方法,进行深度复制,并在简历类中调用clone方法完成深度复制。

package com.learn.java.javabase.designpattern.prototype;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Remark implements Cloneable {
    private String remarkValue;

    @Override
    public Remark clone() {
        Remark remark = null;
        try {
            remark = (Remark) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return remark;
    }
    @Override
    public String toString(){
        return remarkValue;
    }

}

测试类

package com.learn.java.javabase.designpattern.prototype;

public class TestProtoType {
    public static void main(String[] args) {
        CloneResume01 jackResume=new CloneResume01("fang","28","2017-2019","comp1"
                ,new Remark("first job"));
        CloneResume01 jackResume02=jackResume.clone();
        //Remark没有实现clone方法,下面这句话会因为是复制新的Remark对象,所以打印的Remark是不一样的
        //jackResume02.setRemark(new Remark("second job"));
        //浅复制和深复制,Remark和Resume实现类两个clone方法没有修改,会因为浅复制吗,导致拷贝的实例的值与原型的值是一样的
        jackResume02.getRemark().setRemarkValue("second job");
        jackResume02.setWorkInfo("2020-now","comp2");
        jackResume.display();
        jackResume02.display();
    }
}

运行结果

22:44:53.007 [main] INFO com.learn.java.javabase.designpattern.prototype.CloneResume01 - name = fang ,age = 28 , in year 2017-2019  comp1,remark =first job
22:44:53.010 [main] INFO com.learn.java.javabase.designpattern.prototype.CloneResume01 - name = fang ,age = 28 , in year 2020-now  comp2,remark =second job

原文地址:https://www.cnblogs.com/JuncaiF/p/12247121.html

时间: 2024-08-27 09:59:17

设计模式之原型设计模式的相关文章

设计模式之:原型设计模式

原型设计模式(Prototype Design Pattern)很有意思, 因为它使用了一种克隆技术来复制实例化的对象. 新对象是通过复制原型实例来创建的. 在这里, 实例是批实例化的具体类.原型设计模式的目的是通过使用克隆来减少实例化对象的开销.与其从一个类实例化新对象, 完全可以使用一个已有实例的克隆. 克隆函数 PHP中使用原型设计模式的关键是要了解如何使用内置函数__clone(). <?php abstract class CloneObject { public $name; pub

【设计模式】——原型模式

原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 下图是原型模式的结构图: 原型模型其实就是一个对象再创建另外一个可定制的对象,而且不需任何创建的细节,我们来看看基本的原型模式代码. //原型类 class Prototype { private: string id; public: Prototype(string id) { this->id=id; } string GetId() { return id; } virtual Protot

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

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 简单描述:即通过实现接口Cloneable重写方法clone(),使得创建新的拷贝对象不需要一个成员一个成员的重新复制,而且可以提高创建对象的效率 Java中要想实现拷贝使用clone()方法,类必须实现Cloneable接口,并且重写Object类中的clone()方法,调用父类的clone()方法即可实现浅复制 代码如下: WorkExperience类: 1 package com.longsheng.prototy

Design Pattern Prototype 原型设计模式

Prototype设计模式其实就是利用一个深拷贝的功能,在原有的类中,通过一个clone函数,创建一个新的类,并可以利用好原有的数据. 这样可以轻易clone出多个新的对象操作,而且都有各自的内存空间. #include <string> #include <iostream> using namespace std; class MultiData { protected: bool b; char c; string s; int a; public: virtual Mult

原型设计模式prototype-构造js自定义对象

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 原型模式: prototype 原型属性 对象的原型拥有的属性,该对象的实例对象也会同时拥有 */ function Test(){ } T

iOS设计模式-原型模式

| 导语 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 通过深复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象.这个指定的对象可被称为“原型”对象,也就是通过复制原型对象来得到更多同类型的对象.即原型设计模式.iOS中使用copy协议完成这个过程. 原型模式主要用于对象的深复制,它的核心是就是类图中的原型类Prototype. 原型模式的核心思想是把复制的过程封闭到对象的内部完成.第一个好处是修改复制的过程而不影响外部的使用者. 原型模式的优点及使用场景 简化对

大话设计模式之原型模式

原型模式 定义: 用原型实例制定创建对象的种类,并通过拷贝这些原型,创建新的对象. 实质: 就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建的细节. 核心: (1).实现Cloneable接口,可以使用此接口的类上使用clone方法. (2).重写Object类中的clone方法,因为所有类的父类是Object类,Object有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,将clone改为public类型. 结构图: 代

06.设计模式_原型模式

转载自 http://www.cnblogs.com/zhili/p/PrototypePattern.html 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并

C#设计模式:原型模式(Prototype)及深拷贝、浅拷贝

原型模式(Prototype) 定义: 原型模式:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象.被复制的实例被称为原型,这个原型是可定制的. Prototype Pattern也是一种创建型模式,它关注的是大量相同或相似对象的创建问题.应用原型模式就是建立一个原型,然后通过对原型来进行复制的方法,来产生一个和原型相同或相似的新对象,或者说用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 模式中的角色 抽象原型类(Abstract Prototype):提供一个克