首页 > 编程语言 >Java学设计模式之原型模式

Java学设计模式之原型模式

时间:2024-05-09 15:06:16浏览次数:19  
标签:设计模式 Java 克隆 对象 原型 ConcretePrototype property public

一、原型模式概念

原型模式是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而不是通过实例化类来创建。这种方式可以提高创建对象的效率,特别是当对象的创建过程比较昂贵或复杂时。

在原型模式中,原型对象是一个已经存在的对象,它作为新对象的模板。新对象通过复制原型对象的属性来创建,可以是浅拷贝(只复制基本数据类型的属性)或深拷贝(复制对象的所有属性,包括引用类型的属性)。

原型模式通常涉及以下几个角色:

  1. 原型接口(Prototype):定义了一个克隆自身的接口,可以是抽象类或接口。

  2. 具体原型类(Concrete Prototype):实现了原型接口,提供了克隆自身的方法。

  3. 客户端(Client):负责创建新对象的地方,通常通过克隆现有对象来创建新对象。

1.1 什么是原型模式

二、原型模式代码

2.1 原型接口

public interface Prototype {
    Prototype clone();
}

2.2 具体原型类

public class ConcretePrototype implements Prototype {
    private String property;

    public ConcretePrototype(String property) {
        this.property = property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    public String getProperty() {
        return property;
    }

    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.property); // 浅拷贝
    }
}

2.3 客户端

public class PrototypePatternTest {
    public static void main(String[] args) {
        ConcretePrototype prototype = new ConcretePrototype("Initial Property");
        System.out.println("原型:" + prototype.getProperty());

        ConcretePrototype clonedPrototype = (ConcretePrototype) prototype.clone();
        System.out.println("克隆的原型: " + clonedPrototype.getProperty());

        // 修改原型属性不影响克隆对象
        prototype.setProperty("Modified Property");
        System.out.println("修改后的原型: " + prototype.getProperty());
        System.out.println("修改后的克隆原型: " + clonedPrototype.getProperty());

        // 输出:
        // 原型:Initial Property
        // 克隆的原型: Initial Property
        // 修改后的原型: Modified Property
        // 修改后的克隆原型: Initial Property
    }
}

三、总结

原型模式的优点包括:

  • 减少了创建对象的开销,特别是当对象的创建过程比较复杂时。
  • 可以通过复制现有对象来创建新对象,使得代码更加灵活,易于维护。

原型模式的缺点包括:

  • 需要实现克隆方法,有时可能会比较麻烦。
  • 如果对象的构造过程比较复杂,克隆可能并不是一个很好的选择。

总的来说,原型模式适用于需要创建大量相似对象,并且创建过程比较昂贵的情况下。

标签:设计模式,Java,克隆,对象,原型,ConcretePrototype,property,public
From: https://www.cnblogs.com/Linzj5950/p/18182243

相关文章

  • 国密算法SM3-java实现
    maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency> SM3Utilsimportorg.bouncycastle.crypto.digests.SM3Dig......
  • 国密算法SM4-java实现
    Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>SM4importjava.io.ByteArrayInputStream;importjava.......
  • Java学设计模式之建造者模式
    一、建造者模式概念1.1什么是建造者模式建造者模式是一种创建型设计模式,用于将一个复杂对象的构建过程与其表示分离,以便同样的构建过程可以创建不同的表示。它允许客户端通过相同的构建过程来构建不同的产品。建造者模式通常涉及以下几个角色:产品(Product):表示被构建的复杂对......
  • [LeetCode] 最短的桥 双BFS Java
    Problem:934.最短的桥目录思路复杂度Code思路先找到第一个岛屿,根据每一个岛屿的岛屿块的位置多源查找这个块与第二个岛屿的距离,先找到的就是最少的距离同时,将已遍历过的岛屿标记为-1,避免重复入队复杂度时间复杂度:添加时间复杂度,示例:$O(n^2)$空间复杂度:添......
  • 国密算法SM2-java实现
    Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>工具类importjava.math.BigInteger;publicclassUtil{......
  • java测试框架Junit5进阶知识点
    声明参数化导入注解<!--junit5新的编程和扩展模型--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version>......
  • Java-读取resource目录下的文件并返回给前端
    我在项目的resource目录下面放了一个模板文件,用来供用户下载提供一个接口给前端,用来下载在Utils类下面写个方法来读取代码publicstaticvoidgetXMindTemplate(HttpServletResponseresponse){StringfileName="templates/TestCaseTemplate.xmind";//文件名称ClassPa......
  • Java-LocalDateTime时间和时间(时间加减)
    前言一开始使用Date类来表述时间属性一个问题是时间戳的问题,另一个问题是读取Excel数据格式的时候没有那么灵活 1.基本知识LocalDateTime是Java8引入的日期和时间API中的一个类,位于java.time包中。它提供了一种更灵活、更方便的方式来处理日期和时间,相比旧的Date类更为......
  • java 多线程CountDownLatch
     CountDownLatch简介CountDownLatch 是Java中的一个同步工具类,可以用来确保一组线程等待其他线程完成各自工作后再继续执行。CountDownLatch的应用场景CountDownLatch可以被广泛应用于各种多线程协作的场景,例如:主线程等待多个子线程完成后再执行下一步操作。多个子任......
  • Java学设计模式之工厂模式
    一、工厂模式概念工厂模式是一种创建型设计模式,用于创建对象而不需要暴露对象的创建逻辑。它将对象的实例化过程封装在一个单独的类中,使得客户端代码只需通过调用工厂类的方法来获取所需的对象,而无需关心具体的实例化过程。工厂模式通常有三种主要的变体:简单工厂模式、工厂方法......