【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

简介: 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

文章目录

I . 原型模式 概念简介

II . 原型模式 使用场景

III . 原型模式 优缺点

IV . 原型模式 实现及 简单示例



I . 原型模式 概念简介


原型模式 : 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象



① 设计模式类型 : 创建型设计模式 ;


② 原型实例对象 : 给出原型实例对象 , 根据该对象创建新对象 ;


③ 创建对象类型 : 创建对象的种类由原型的实例对象类型确定 ;


④ 创建方式 : 不调用构造函数 , 而是通过克隆原型的实例对象 , 使用现有对象创建另一个相同类型的对象 , 隐藏创建细节 ;




II . 原型模式 使用场景


原型模式使用场景 : 原型模式的目的是 降低实例对象个数 , 减少构造函数的调用次数 ;



① 类初始化消耗资源过多 : 如果类初始化时消耗过多的资源 , 如这个类中某个成员占用大量内存 , 为了节省开销 ;


② 初始化繁琐耗时 : 类对象创建时经过大量的计算 , 或与本地资源 ( 数据库 , 文件 ) 频繁交互 , 每次创建消耗大量的 CPU 与 时间资源 ;


③ 构造函数复杂 : 类中定义的构造函数复杂 ;


④ 实例对象数量庞大 : 如果在内存中循环创建了很多该实例对象 , 就可以使用原型模式复用不用的对象 , 用于创建新对象 ;




III . 原型模式 优缺点


1 . 原型模式优点 : 性能高 , 简单 ;



① 性能高 : 使用原型模式复用的方式创建实例对象 , 比使用构造函数重新创建对象性能要高 ; ( 针对类实例对象开销大的情况 )


② 流程简单 : 原型模式可以简化创建的过程 , 可以直接修改现有的对象实例的值 , 达到复用的目的 ; ( 针对构造函数繁琐的情况 )



2 . 原型模式缺点 : 实现复杂 , 坑多 ;



① 覆盖 clone 方法 ( 必须 ) : 必须重写对象的 clone 方法 , Java 中提供了 cloneable 标识该对象可以被拷贝 , 但是必须覆盖 Object 的 clone 方法才能被拷贝 ;


② 深拷贝 与 浅拷贝 风险 : 克隆对象时进行的一些修改 , 容易出错 ; 需要灵活运用深拷贝与浅拷贝操作 ;




IV . 原型模式 实现及 简单示例


1 . 原型模式实现 :



① 对象创建原理 : 创建实例对象时使用原型模式 , 就是调用类的 clone 方法 , 直接克隆拷贝现有的实例对象 , 生成新的对象 ;


② 实现 Cloneable 接口 : 原型模式类需要实现 Cloneable 接口 , 如下面的 Student 类 ( class Student implements Cloneable ) 就实现了该接口 ;


③ 重写 clone() 方法 : 通常情况下直接调用父类的 clone 方法即可 , 这种方式是浅拷贝 ,


protected Object clone() throws CloneNotSupportedException{}


2 . 原型模式类代码示例 :



① 代码实现 : Student 类实现 Cloneable 接口 , 重写了 clone() 方法 , 直接调用父类的 clone() 方法 ;
② 地址打印 : 注意 toString 中调用到了父类的打印方法 , super.toString() , 该方法打印 类名@地址 信息 , 可以帮助我们通过内存地址信息 , 看到是否真正的创建了一个新的实例对象 ;
package kim.hsl.design.prototype;
/**
 * 原型模式实现流程 : 使用 clone 方法实现原型模式
 * 1 . 类继承 Cloneable 接口
 * 2 . 实现 protected Object clone() 方法
 */
public class Student implements Cloneable {
    private String name;
    private int age;
    public Student() {
        System.out.println("调用 Student 默认构造函数");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        System.out.println("调用 Student clone 方法");
        return super.clone();
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", " + super.toString() +
                '}';
    }
}



3 . 使用原型模式创建实例测试代码 :



① 创建一个原型对象 : 首先使用构造函数 , 创建一个原型对象 newStudent , 之后的对象都是根据该原型对象 clone 创建的 ;
② 使用原型模式创建对象 : 循环中 , 通过调用原型对象 newStudent 的 clone() 方法 , 创建一个新的对象 ;
③ 性能分析 : 使用 clone 方法创建对象 , 比直接使用 new 构造函数方法开销更小 , 性能更高 , 如果要创建大量该对象示例 , 建议使用原型模式 , 使用 clone() 方法大量创建该对象 ;
package kim.hsl.design.prototype;
public class Main {
    public static void main(String[] args) {
        try {
            //测试使用 clone 方法实现的原型模式 , 使用原型模式创建 10 个对象
            Student newStudent = new Student();
            /*
                需求声明 : 此时要创建 10 个 Student 对象
                         依次调用一个创建好的 Student 对象的 clone 方法 10 次
                         即可创建 10 个不同的对象
                适用场景 : 这是频繁创建大量的对象 , 该场景下适合使用原型模式
             */
            for (int i = 0; i < 10; i++) {
                // 1 . 使用 clone 方法创建对象
                Student student = (Student) newStudent.clone();
                // 2 . 设置克隆出的对象参数
                student.setName("Tom" + i);
                student.setAge(10 + i);
                System.out.println(student);
            }
        } catch (CloneNotSupportedException e) {
            //捕获 clone 方法可能产生的异常
            e.printStackTrace();
        }
    }
}




4 . 执行结果 : 通过打印出的字符串序列分析 , 注意每个对象的地址 Student@1b6d3586 , Student@4554617c … , 10 个对象的地址都不相同 , 说明每个对象都是一个新的实例对象 ;


调用 Student 默认构造函数
Student clone 方法
注册学生信息 : Student{name='Tom0', age=10, kim.hsl.design.prototype.Student@1b6d3586}
Student clone 方法
注册学生信息 : Student{name='Tom1', age=11, kim.hsl.design.prototype.Student@4554617c}
Student clone 方法
注册学生信息 : Student{name='Tom2', age=12, kim.hsl.design.prototype.Student@74a14482}
Student clone 方法
注册学生信息 : Student{name='Tom3', age=13, kim.hsl.design.prototype.Student@1540e19d}
Student clone 方法
注册学生信息 : Student{name='Tom4', age=14, kim.hsl.design.prototype.Student@677327b6}
Student clone 方法
注册学生信息 : Student{name='Tom5', age=15, kim.hsl.design.prototype.Student@14ae5a5}
Student clone 方法
注册学生信息 : Student{name='Tom6', age=16, kim.hsl.design.prototype.Student@7f31245a}
Student clone 方法
注册学生信息 : Student{name='Tom7', age=17, kim.hsl.design.prototype.Student@6d6f6e28}
Student clone 方法
注册学生信息 : Student{name='Tom8', age=18, kim.hsl.design.prototype.Student@135fbaa4}
Student clone 方法
注册学生信息 : Student{name='Tom9', age=19, kim.hsl.design.prototype.Student@45ee12a7}


目录
相关文章
|
8月前
|
设计模式
二十三种设计模式全面解析-访问者模式的高级应用和实践技巧
二十三种设计模式全面解析-访问者模式的高级应用和实践技巧
|
15天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
15天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
5月前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
8月前
|
设计模式 算法
二十三种设计模式全面解析-迭代器模式进阶篇:探索变体与扩展
二十三种设计模式全面解析-迭代器模式进阶篇:探索变体与扩展
106 0
|
设计模式 算法 程序员
java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】
java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】
364 0
|
设计模式
【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
150 0
【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
|
设计模式 Kotlin
【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
143 0
【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
|
设计模式
【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
146 0
【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(二)
|
设计模式
【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(一)
【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )(一)
1081 0