设计模式入门:原型模式

UML类图

原型模式

代码示例

  实际应用中,原型模式可以简单理解为克隆操作。在大多数面向对象编程语言中,实现克隆操作并不复杂,对于Java,我们只需继承Cloneable接口,并重写Object的clone()即可(非必须)。

public class Teacher implements Cloneable {

    /**
     * 姓名
     */
    private String name;

    private Teacher(String name) {
        try {
            // 模拟初始化资源耗时较多
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "name='" + name + '\'' +
                '}';
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Teacher teacher = new Teacher("李老师");
        // output: teacher = Teacher{name='李老师'}
        System.out.println("teacher = " + teacher);

        // clone is much faster
        Teacher cloneTeacher = (Teacher) teacher.clone();
        // output: cloneTeacher = Teacher{name='李老师'}
        System.out.println("cloneTeacher = " + cloneTeacher);
    }

}

  clone()方法会抛出未检查的CloneNotSupportedException,通过源码了解下什么情况下会产生该异常。

Object Clone()

  该方法有native修饰,这说明它的具体实现在底层(参考JNI)。文档说明,在当前克隆类没有实现Cloneable接口的情况下,该异常将会触发。另外,还有这么一句值得我们留意,Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.,这说明clone()实现的是浅拷贝而不是深拷贝(下个话题深入)。最后,重写clone()是非必须的,一般重写只是用来提高方法的访问权限。

总结思考

  原型模式通过()拷贝现有对象以生成新的对象,属于创建型模式中的一种。对比通过new的方式来实例化对象,这种模式不用重新初始化对象,可以动态的获得对象运行时的状态,也适用于需要优化性能的场景,例如当类的初始化需要消耗非常多的资源,就可以考虑使用这种模式了。   接触原型模式,不可避免的就是关于浅拷贝和深拷贝的问题,下一篇准备深入了解下这个话题。

示例代码

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

网易云课堂公开课-Promise【文字版】

今天的网易云课堂的公开课已经结束,因为是第一次,所以有些操作也不太熟练,下面是本次公开课的文字内容。

16520
来自专栏软件开发 -- 分享 互助 成长

工厂方法模式

一、相关介绍 1、工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 2、UML图 ? 3、所属类别:创建...

21970
来自专栏学习力

《Java从入门到放弃》框架入门篇:Struts2的基本数据传递方式 推荐

17540
来自专栏向治洪

Java 8新特性

编者注:Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。 在Java Code Geeks上已经有大量的关于Java 8 的...

39560
来自专栏黑泽君的专栏

java基础学习_IO流03_字符流、IO流小结、案例_day21总结

10220
来自专栏xingoo, 一个梦想做发明家的程序员

MFC中注释含义

下面是 CStdioFile 类的部分列表,其中使用了 MFC 在其类中按类成员的用法划分它们时所采用的大多数标准注释: class CStdioFile :...

20570
来自专栏Echo is learning

字符、字符集、编码,以及它们python中会遇到的一些问题(上)

20670
来自专栏做全栈攻城狮

电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货

课程总目录:因头条无法自定义目录,大家关注:“做全栈攻城狮”微信公众号。回复“.net目录”,即可获取。微信公众号也包含大量学习教程,等你来~

15640
来自专栏好好学java的技术栈

一文看透java8新特性

毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具...

13620
来自专栏企鹅号快讯

verilog编程要素整理时刻牢记

verilog编程建议 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:forever,while等; 4、尽量采用同步方式设...

20580

扫码关注云+社区

领取腾讯云代金券