一文带你了解Java创建型设计模式之原型模式

一文带你了解Java创建型设计模式之原型模式

什么是原型模式?

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过实例化类来创建。这种模式通过克隆已有对象来创建新对象,从而避免了创建对象时的复杂初始化过程。

原型模式的实现方式

在Java中,实现原型模式通常需要满足以下两个条件:

  1. 实现Cloneable接口:该接口是一个标记接口,用于指示对象可以进行克隆操作。
  2. 重写clone()方法:在该方法中,通过调用super.clone()方法来创建对象的副本。

下面是一个示例代码,演示了如何使用原型模式创建对象:

public abstract class Shape implements Cloneable {
    private String id;
    protected String type;

    public abstract void draw();

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

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

public class Circle extends Shape {
    public Circle() {
        type = \"Circle\";
    }

    @Override
    public void draw() {
        System.out.println(\"Inside Circle::draw() method.\");
    }
}

public class Rectangle extends Shape {
    public Rectangle() {
        type = \"Rectangle\";
    }

    @Override
    public void draw() {
        System.out.println(\"Inside Rectangle::draw() method.\");
    }
}

public class Square extends Shape {
    public Square() {
        type = \"Square\";
    }

    @Override
    public void draw() {
        System.out.println(\"Inside Square::draw() method.\");
    }
}

public class ShapeCache {
    private static Map<String, Shape> shapeMap = new HashMap<>();

    public static Shape getShape(String shapeId) {
        Shape cachedShape = shapeMap.get(shapeId);
        return (Shape) cachedShape.clone();
    }

    public static void loadCache() {
        Circle circle = new Circle();
        circle.setId(\"1\");
        shapeMap.put(circle.getId(), circle);

        Rectangle rectangle = new Rectangle();
        rectangle.setId(\"2\");
        shapeMap.put(rectangle.getId(), rectangle);

        Square square = new Square();
        square.setId(\"3\");
        shapeMap.put(square.getId(), square);
    }
}

public class PrototypePatternDemo {
    public static void main(String[] args) {
        ShapeCache.loadCache();

        Shape clonedShape1 = ShapeCache.getShape(\"1\");
        System.out.println(\"Shape : \" + clonedShape1.getType());

        Shape clonedShape2 = ShapeCache.getShape(\"2\");
        System.out.println(\"Shape : \" + clonedShape2.getType());

        Shape clonedShape3 = ShapeCache.getShape(\"3\");
        System.out.println(\"Shape : \" + clonedShape3.getType());
    }
}

在上述示例中,我们定义了一个抽象类Shape,它实现了Cloneable接口并重写了clone()方法。然后,我们创建了三个具体的形状类CircleRectangleSquare,它们都继承自Shape类并实现了draw()方法。我们还创建了一个ShapeCache类,用于缓存形状对象,并提供了getShape()方法来获取克隆的形状对象。最后,在PrototypePatternDemo类中,我们演示了如何使用原型模式来创建对象。

通过以上示例,您可以了解如何使用原型模式在Java中创建对象。原型模式可以帮助我们避免复杂的对象初始化过程,提高对象创建的效率和灵活性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你了解Java创建型设计模式之原型模式 - Python技术站

(0)
上一篇 2023年10月15日
下一篇 2023年10月15日

相关文章

  • SpringBoot使用ip2region获取地理位置信息的方法

    SpringBoot使用ip2region获取地理位置信息的方法攻略 简介 ip2region是一个基于ip地址的地理位置查询库,可以根据IP地址快速获取对应的地理位置信息。在SpringBoot项目中使用ip2region可以方便地获取访问者的地理位置信息,从而实现一些个性化的功能。 步骤 步骤一:添加依赖 首先,在你的SpringBoot项目的pom.x…

    other 2023年7月31日
    00
  • NOI Linux 快速入门指南

    NOI Linux 快速入门指南的完整攻略 本文将为您详细讲解 NOI Linux 快速入门指南,包括介绍、安装、常用命令、示例说明等内容。 介绍 NOI Linux 是一款基于 Ubuntu 的 Linux 发行版,专门为竞赛选手和程序员设计。它提供了一系列优秀的开发工具和编程环境,可以帮助用户更加高效地进行编程和竞赛。 安装 NOI Linux 的安装非…

    other 2023年5月6日
    00
  • golang 解析word文档操作

    以下是使用golang解析Word文档的完整攻略: 首先,我们需要使用第三方库来解析Word文档。推荐使用github.com/360EntSecGroup-Skylar/excelize库,它提供了丰富的功能来处理Excel文件。 在开始之前,确保您已经安装了Go语言的开发环境,并且已经配置好了GOPATH和GOROOT。 使用以下命令来安装exceliz…

    other 2023年10月17日
    00
  • gitlab的ssh配置(linux和windows双版本)

    以下是“GitLab的SSH配置(Linux和Windows双版本)”的完整攻略: GitLab的SSH配置 GitLab是一个基于Web的Git仓库管理工具,它支持SSH协议进行代码的上传和下载。本攻略将介绍如何在Linux和Windows系统上配置GitLab的SSH。 Linux系统上的SSH配置 以下是在Linux系统上配置GitLab SSH的步骤…

    other 2023年5月7日
    00
  • python+opencv实现阈值分割

    Python+OpenCV实现阈值分割攻略 阈值分割是图像处理中常用的一种方法,用于将图像分割成不同的区域,以便进行后续的分析和处理。在本攻略中,我们将使用Python编程语言和OpenCV库来实现阈值分割。 步骤1:导入库和读取图像 首先,我们需要导入必要的库和模块,并读取待处理的图像。在这个例子中,我们将使用OpenCV的cv2模块来处理图像。 impo…

    other 2023年7月29日
    00
  • 详解springboot配置多个redis连接

    下面我来详细讲解如何配置多个Redis连接的方法。 1. 添加Redis依赖 首先,打开您的Spring Boot 项目的 pom.xml 文件并添加以下 Redis 相关依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&…

    other 2023年6月26日
    00
  • 详解Go语言的内存模型及堆的分配管理

    详解Go语言的内存模型及堆的分配管理 Go语言是一种现代化的编程语言,它提供了一种简单而高效的内存管理模型。本文将详细讲解Go语言的内存模型以及堆的分配管理,并提供两个示例来说明。 内存模型 Go语言的内存模型基于并发原语,它允许多个goroutine(轻量级线程)同时执行。每个goroutine都有自己的栈,栈用于存储局部变量和函数调用信息。除了栈之外,G…

    other 2023年8月2日
    00
  • 阿里云正式上线移动直播问答解决方案,助力APP尽情“撒币”

    阿里云移动直播问答解决方案介绍 阿里云正式上线移动直播问答解决方案,为APP提供了内置的实时问答解决方案,帮助APP加强用户互动,提升用户留存率和活跃度。该方案支持移动直播、录播和视频点播场景,快速部署和易于开发。 方案优势 高效:提供了完备的H5界面和easyLive API,方便快速实现。 简洁:不需要额外的服务器和后端管理,包含账号管理、直播管理、答题…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部