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

Java的设计模式之原型模式

时间:2023-11-13 12:04:42浏览次数:31  
标签:Java 克隆 对象 创建 Shape 原型 设计模式 type

在某些情况下,需要创建对象的副本,但是复制一个对象的成本可能很高,或者希望避免与对象的具体类耦合。例如,当创建对象的过程较为复杂,或者对象包含大量共享的状态时,使用常规的创建方法可能会导致性能下降。

原型模式的解决方案是通过复制现有对象来创建新对象,而不是从头开始构建。这允许我们以更高效的方式创建新对象,同时避免了与对象类的直接耦合。核心概念是在原型对象的基础上进行克隆,使得新对象具有与原型相同的初始状态

在原型模式中,通常会有以下几个角色:

  • 抽象原型(Prototype):声明克隆方法,作为所有具体原型的基类或接口。
  • 具体原型(Concrete Prototype):实现克隆方法,从自身创建一个副本。
  • 客户端(Client):使用原型对象的客户端代码,在需要新对象时通过克隆现有对象来创建新实例

原型模式的应用有以下好处:

  • 减少对象创建的成本:避免了复杂对象的重复初始化过程,提高了创建对象的效率。
  • 避免与具体类耦合:客户端可以通过克隆方法创建新对象,而无需知道具体类的细节,降低了耦合度。
  • 灵活性增加:可以在运行时动态地添加或删除原型,适应不同的对象创建需求。
  • 支持动态配置:可以通过克隆来定制对象的不同配置,而无需修改其代码。

原型模式的应用也有以下坏处:

  • 深克隆问题:原型模式默认进行浅克隆,即复制对象本身和其引用。如果对象内部包含其他对象的引用,可能需要实现深克隆来复制整个对象结构。
  • 克隆方法的实现:某些对象可能不容易进行克隆,特别是涉及到文件、网络连接等资源的情况。

原型模式是一种在需要创建对象副本时非常有用的设计模式,它提供了一种灵活且高效的方法来处理对象的复制需求。

代码实例:

// 创建一个实现 Cloneable 接口的原型类
class Shape implements Cloneable {
    private String type;

    public Shape(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public Shape clone() {
        try {
            return (Shape) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

// 测试原型模式
public class PrototypeExample {
    public static void main(String[] args) {
        // 创建原型对象
        Shape circle = new Shape("Circle");
        
        // 克隆原型对象来创建新对象
        Shape clonedCircle = circle.clone();
        clonedCircle.setType("Cloned Circle");

        // 输出原型对象和克隆对象的类型
        System.out.println("Original Shape Type: " + circle.getType());
        System.out.println("Cloned Shape Type: " + clonedCircle.getType());
    }
}


标签:Java,克隆,对象,创建,Shape,原型,设计模式,type
From: https://blog.51cto.com/BakerZhuang/8340335

相关文章

  • JAVA
    Java是一种具有简单的、面向对象的、分布式的、解释型的、健壮的、安全的、体系结构中立的、可移植的、高性能的、多线程的、动态的语言。JVE是虚拟机  JRE是JAVA的运行环境  JDK是程序开发工具包 写一个类的模版(简单称呼编写Java源代码)publicclass类名{  publ......
  • java中类名一定要和java文件名一致吗?
    原文链接:https://blog.csdn.net/qq_42449963/article/details/106199732 结论:首先java中类名不一定要和java文件名一致,是否一致需要分情况,其次java中可以有多个类,但是最多只有一个类的类名和文件名相同,如果一个类被public修饰,那该类的类名必须和文件名相同,并且一个java文件中......
  • Java异常
     异常异常是程序执行时,出现的意想不到的情况,导致你的程序会无法正常运行。异常类的种类(1)java.lang.Throwable类是Java程序执行过程中发生的异常时间对应类的父类(2)Throwable可分为两类:Error(错误)和Exception(异常)①Error:Java虚拟机无法解决的严重问题。比如JVM系统内......
  • java引入jep实现四则运算包含负数且规范两位小数
    1.在pom中引入依赖<!--四则运算--><dependency><groupId>jep</groupId><artifactId>jep</artifactId><version>2.24</version></dependency>2.调用实现计算 publics......
  • 《实战Java高并发程序》——第2章 Java并行程序基础
    进程和线程简单的话来说,在Windows中看到的后缀为.exe的文件都是程序。不过程序是"死"的、静态的。当双击这个.exe文件的时候,这个.exe文件中的执行就会被加载,你就能得到一个有关这个程序的进程。进程是"活"的,或者说是正在被执行的。进程中可以容纳若干线程。那进程和线程之间究......
  • JAVA Set集合的深拷贝
    之前在做统计的时候,用到Set集合,存储到Map中,但是因为是浅拷贝,导致数据错误问题。这里记录下如何深度拷贝Set关于浅拷贝和深拷贝的的问题,请参考另一篇文章《JAVA的深拷贝和浅拷贝》简而言之:深拷贝是完全创建一个新的对象,是一个全新的对象。而浅拷贝仅仅复制所考虑的对象,而不复制......
  • macOS系统安装Java环境 Jdk1.8安装 新手详细教程(全网最详细)
    1.jdk安装包下载https://www.oracle.com/cn/java/technologies/downloads/#java8-mac 点击同意条款,并下载. 注册/登录Oracle. 2.下载完成之后双击安装包进行安装. 输入开机密码,安装软件. 3.配置JDK环境变量.(1)打开终端: 打开访达,选择应用程序中的实......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • 享元模式--Java实现
    相关类图具体代码//ChessFactory.javapackageorg.example.test012;importjava.util.Hashtable;publicclassChessFactory{publicstaticChessFactorygetChessFactory(){returnchessFactory;}publicstaticChessFactorychessFactory=......
  • java.net.ConnectException: Connection refused: no further information
    问题描述报错原因在测试过程中,没有开启Redis解决方案开启Redis,再重新运行代码即可解决......