设计模式-----原型模式

一、 定义
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建对象,就是从一个对象再创建另外一个可定制的对象,而且不需要指定任何创建的细节。
拷贝涉及到深拷贝和浅拷贝,浅拷贝指被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深拷贝,把引用对象的变量指向复制过得新对象,而不是原有的被引用对象。
原型模式通常适用于以下场景。
• 对象之间相同或相似,即只是个别的几个属性不同的时候。
• 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
• 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
• 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值

二、 结构图
在这里插入图片描述

扩展,带原型管理器,可以通过get(String id)获取相应类型的原型

在这里插入图片描述

三、 示例代码(待补充)

package org.example.PrototypeModel;

public  class Prototype implements Cloneable {

    private String personName="";
    private int workyear = 0;
    private String workcontent="";

//    public Prototype(String personName, int workyear, String workcontent) {
//        this.personName = personName;
//        this.workyear = workyear;
//        this.workcontent = workcontent;
//    }

    public  Prototype clone() throws CloneNotSupportedException {
       return (Prototype) super.clone();
    }
//    {
//        Prototype pt = null;
//        try {
//            pt = (Prototype) super.clone();
//        } catch (CloneNotSupportedException e) {
//            e.printStackTrace();
//        }
//        return pt;
//    }

    public String getPersonName() {
        return personName;
    }

    public void setPersonName(String personName) {
        this.personName = personName;
    }

    public int getWorkyear() {
        return workyear;
    }

    public void setWorkyear(int workyear) {
        this.workyear = workyear;
    }

    public String getWorkcontent() {
        return workcontent;
    }

    public void setWorkcontent(String workcontent) {
        this.workcontent = workcontent;
    }
}

package org.example.PrototypeModel;

public class PrototypeA extends  Prototype {

    public PrototypeA(String personName,int workyear,String workcontent){
        this.setPersonName(personName);
        this.setWorkyear(workyear);
        this.setWorkcontent(workcontent);
        //super(personName,workyear,workcontent);
    }

    public void show(){
        System.out.println("*********jianli*************");
        System.out.println("name:" + this.getPersonName());
        System.out.println("workyear:" + this.getWorkyear());
        System.out.println("workcontent:" + this.getWorkcontent());
    }

    @Override
    public PrototypeA clone() {
        PrototypeA pt = null;
        try {
            pt = (PrototypeA) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return pt;
    }
}


package org.example.PrototypeModel;

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        PrototypeA pt = new PrototypeA("jhone",3,"lkoojj");

        PrototypeA pta = pt.clone();
        pta.setPersonName("lily");
        pta.setWorkyear(4);
        pta.setWorkcontent("lskfjkkdfljd");

        pta.show();
        pt.show();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值