前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【“别跟我不会”系列】Java设计模式之原型模式

【“别跟我不会”系列】Java设计模式之原型模式

作者头像
23号杂货铺
发布2019-09-27 15:50:48
2190
发布2019-09-27 15:50:48
举报
文章被收录于专栏:23号杂货铺23号杂货铺

想了解其它设计模式的欢迎关注本公众号联系小编获得相关内容。 —— 23号老板

0

1

引入

原创:爱吃回锅肉的瘦子

原型模式是用于创建重复对象,同时保证性能,一般应用场景是我们需要重复创建多个对象,例如在循环体中赋值一个对象。原型模式是用于创建重复对象,同时保证性能,一般应用场景是我们需要重复创建多个对象,例如在循环体中赋值一个对象。

0

2

思路

它是通过给出一个原型对象来指明所创建得对象的类型,然后使用自身的克隆接口来复制这个原型对象,以此来创建出更多同种类型的对象。

0

3

代码

//实现Cloneable 接口的原型抽象类 cloneTypeTest
class CloneTypeTest implements Cloneable {
    //重写clone方法
    @Override
    protected CloneTypeTest clone() throws
CloneNotSupportedException {
        CloneTypeTest cloneTypeTest = null;
        cloneTypeTest = (CloneTypeTest) super.clone();
        return cloneTypeTest;
    }
}

//实现原型类
class ChildCloneTypeTest extends CloneTypeTest {
    public void show() {
        System.out.println("原型实现类");
    }
}

class Client {
    public static void main(String[] args) {
        ChildCloneTypeTest childCloneTypeTest =
new ChildCloneTypeTest();
        for (int i = 0; i < 10; i++) {
            try {
                ChildCloneTypeTest cp =
(ChildCloneTypeTest) childCloneTypeTest.clone();
                cp.show();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }

        }
    }
}

0

4

实现核心

1. 实现Cloneable接口:与序列化接口的作用相似,只是告诉虚拟机可以安全的使用clone方法,否则会抛出CloneNotSupportedException的异常。

2. 重写父类Object的clone方法,作用是返回一个copy。

3. 在重写的方法中调用super.clone:默认情况下,类不具备复制对象的能力,需要调用super.clone方法。父类的clone方法是naive方法,直接操作内存的二进制流,特别是复制大对象时,性能差异非常明显。当然了这边的clone形式也可以自定义,比如使用序列化形式(可以解决Cloneable浅拷贝问题)。

Clone方法的注意问题:

调用super.clone方法之后,首先检查当前对象是否支持clone,也就是检查当前对象所属的类是否实现了Cloneable接口,如果支持则创建当前对象所属的类的一个新对象并初始化,使新对象的成员变量的值与当前对象的成员变量的值一模一样,但是对于其他对象的引用以及list等类型的成员属性,是只能复制这些对象的引用。所以简单使用super.clone是浅拷贝。对于浅拷贝带来了一个问题,就是当前对象a里的有个成员变量是指向了一个对象 b,这个b对象里的属性改变了,会引起对象a的clone对象里的b对象也会跟着改变。因此 我们在使用原型模式时候,一定要注释清楚,这个问题,防止下一个接手的程序员忽视了这个坑的存在。当然了 我们可以使用深拷贝来解决这个问题,而深拷贝就是基于浅拷贝来递归实现具体的每个对象。

0

5

应用场景

在一些重复创建对象的场景下,例如一个循环体重复创建同一个对象,我们就可以使用原型模式来提高对象的创建性能。尤其是循环上万次,大对象的情况下,使用new和使用原型模式性能差异非常明显。

不信的话,各位看客老爷亲自可以试验一下。

Spring框架中的使用:其中注解@Scope(“prototype”)为原型模式。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 23号杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档