大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • 设计模式概述
  • 创建型模式

    • 单例模式
    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式
    • 建造者模式
    • 原型模式
      • 一、概述
        • 1.1 解决了什么问题
        • 1.2 解决方案
      • 二、实现方式
        • 2.1 角色
        • 2.2 代码
      • 三、源码中的应用
  • 结构型模式

    • 适配器模式
    • 装饰器模式
    • 代理模式
    • 外观模式
    • 桥接模式
    • 组合模式
    • 享元模式
  • 行为型模式

    • 策略模式
    • 模板方法模式
    • 观察者模式
    • 迭代器模式
    • 责任链模式
    • 命令模式
    • 备忘录模式
    • 状态模式
    • 访问者模式
    • 中介者模式
    • 解释器模式
  • 设计模式
  • 创建型模式
Will
2022-03-29
目录

原型模式

# 一、概述

原型(Prototype)模式可以使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。

一个比较合适例子就是孙悟空拔出猴毛变出许多小猴子,或者细胞克隆的过程。

# 1.1 解决了什么问题

假设有一个对象中的一些属性获取成本是比较高的(可能是从文件系统加载的、或从数据库加载的、或者是经过一系列复杂的计算得到的),而刚好当前的需求中需要多个这种相同的对象,如果在创建每个对象的时候都要经历这种成本比较高的获取方式,那系统性能将会大大降低。

或者可能这些获取成本比较高的属性可能是私有的,通过遍历属性的方式在其外部是获取不到的。

# 1.2 解决方案

原型模式为所有支持克隆的对象声明了一个克隆接口,该接口完成克隆任务,将克隆过程委派给被克隆对象。

# 二、实现方式

# 2.1 角色

原型模式有三个角色:

  1. 抽象原型:一个抽象类或接口,提供一个 clone 方法,具体的原型类是它的子类。
  2. 原型对象:抽象原型的子类,被克隆的对象,重写 clone 方法,提供克隆自己的能力。
  3. 客户:原型对象克隆自己得到的新对象。

# 2.2 代码

定义原型接口,该接口中只有一个 clone 方法,Monkey 类实现该接口,并重写 clone 方法完成克隆任务:

interface ProtoType {
    ProtoType clone();
}

class Monkey implements ProtoType {

    public int forceValue = 60;

    public Monkey() {
    }

    private Monkey(int forceValue) {
        this.forceValue = forceValue;
    }

    /**
     * 假设猴子的成长比较耗时
     *
     * @throws InterruptedException
     */
    public void growUp() throws InterruptedException {
        System.out.println("猴子正在成长");
        Thread.sleep(5 * 1000);
        this.forceValue = 100;
        System.out.println("猴子长大了,武力值充满,可以战斗");
    }

    @Override
    public ProtoType clone() {
        return new Monkey(this.forceValue);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ProtoTypeTest {
    public static void main(String[] args) throws InterruptedException {
        // 假设 monkey01 为孙悟空
        Monkey monkey01 = new Monkey();

        // 孙悟空刚开始的武力值为60,所以克隆出来的小猴子武力值是60
        Monkey monkey02 = (Monkey) monkey01.clone();
        System.out.println(monkey02.forceValue);

        // 孙悟空发育了一会儿,武力值达到了100
        monkey01.growUp();

        // 此时克隆出来的小猴子武力值也是100
        Monkey monkey03 = (Monkey) monkey01.clone();
        System.out.println(monkey03.forceValue);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
60
猴子正在成长
猴子长大了,武力值充满,可以战斗
100
1
2
3
4

# 三、源码中的应用

  1. java.lang.Object#clone()
上次更新: 2023/11/01, 03:11:44

← 建造者模式 适配器模式→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式