设计模式入门:原型模式

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

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()
Object Clone()

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

总结思考

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

示例代码

目录
相关文章
|
7月前
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
88 4
|
2月前
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
70 2
|
2月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
41 0
|
2月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
49 0
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
3月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
2月前
|
设计模式 算法 Java
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
37 0
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
5月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
54 6
下一篇
DataWorks