[设计模式] 关于原型模式 原型实现的俩种方式

什么是原型模式

提供一种创建对象的方式,在程序中创建对象时发送一个已经创建好的对象,在内存中直接copy一份与它一样的对象返回来。可以用来应对结构比较复杂且使用比较多的对象的创建方式。

 /**
         * 代码块编译是报错的,只是拿Object演示  使用clone方法 类必须实现Cloneable接口标记才可以使用克隆方法
还有一种方法是实现序列化的接口 将实例中的信息写入内存中
         */
Object obj1 = new Object();
Object obj2 = obj1.clone();

在这里插入图片描述

注意事项

需要克隆的类必须实现Cloneable接口,Cloneable这个接口中没有方法,只是用来标记的。不标记会抛出java.lang.CloneNotSupportedException

优点

在系统中需要创建大量相同对象时,可以使用原型模式。比如数据统计中的三个月内半年内每天的统计量对象。也可以用来创建结构比较复杂的对象。 原型模式会跳过初始化方法,直接在内存中写值。简化开发,提高效率。

代码实践

clone 的方式

public class CloneDemo implements Cloneable {

 private String name;

    private String price;

    private CloneTest cloneTest;

    @Override
    public CloneDemo clone(){
        CloneDemo cloneDemo = null;
        try{
            cloneDemo = (CloneDemo)super.clone();
        }catch (Exception e){
            e.printStackTrace();
        }
        return cloneDemo;
    }


    public CloneDemo(String name, String price) {
        this.name = name;
        this.price = price;
    }

    public CloneTest getCloneTest() {
        return cloneTest;
    }

    public void setCloneTest(CloneTest cloneTest) {
        this.cloneTest = cloneTest;
    }

    public String getName() {
        return name;
    }

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

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }
}

序列化的方式

对象本身和对象中的引用类型对象都要实现序列化接口



/**
     *  内部的引用类型对象都要实现序列化接口
     * @return
     */
    public CloneDemo cloneDemo(){
        ByteArrayOutputStream bos = null;
        ByteArrayInputStream bis = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        CloneDemo cloneDemo = null;
        try{
            //创建序列化流
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            //将当前对象以对象方式输出
            oos.writeObject(this);
            //创建反序列化流
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            cloneDemo = (CloneDemo)ois.readObject();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                bos.close();
                bis.close();
                oos.close();
                ois.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return cloneDemo;
    }

以上,希望本文可以帮到你。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值