一文带你了解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日

相关文章

  • 关于android:get_tasks权限已弃用

    以下是关于“关于android:get_tasks权限已弃用”的完整攻略,包含两个示例说明。 关于android:get_tasks权限已弃用 在Android 11中,android:get_tasks权限已被弃用。这个权限允许应用程序获取有系统运行的任务的信息。在本攻略中,我们将介绍如何在Android 11中处理这个问题。 1. 了解_tasks权限 …

    other 2023年5月9日
    00
  • C语言中利用封装好的函数实现英文字母的大小写转换

    C语言中利用封装好的函数实现英文字母的大小写转换攻略 在C语言中,我们可以使用封装好的函数来实现英文字母的大小写转换。下面是一个详细的攻略,包含了两个示例说明。 步骤一:包含头文件 首先,我们需要包含头文件<ctype.h>,该头文件中包含了一些用于字符处理的函数。 #include <ctype.h> 步骤二:使用封装好的函数进行大…

    other 2023年8月16日
    00
  • bat复制一个文件夹到另一个目录下

    使用bat批处理实现复制文件夹到另一个目录的操作 在Windows环境下,我们经常需要将一个文件夹复制到另一个目录下。使用Windows资源管理器可以完成这个操作,但当需要复制大量的文件夹时,这种方法显然不够高效。这时候我们可以通过批处理的方式来实现一键复制文件夹的操作,提高复制效率。本文将介绍如何使用bat批处理实现复制文件夹到另一个目录下的操作。 1. …

    其他 2023年3月28日
    00
  • Nginx用户认证配置方法详解(域名/目录)

    下面是Nginx用户认证配置方法详解的完整攻略。 什么是Nginx用户认证? 在Nginx中,用户认证是指通过验证用户名和密码,来限制特定路径或资源只能被特定用户访问。Nginx用户认证可以用于保护网站后台管理页面、个人文件存储和对特定内容的访问等场景。 Nginx用户认证配置方法 步骤1:安装htpasswd工具 htpasswd是一个用于生成和更新基于文…

    other 2023年6月27日
    00
  • 关于JavaScript的单双引号嵌套问题

    关于JavaScript的单双引号嵌套问题攻略 在JavaScript中,字符串可以使用单引号(’)或双引号(\”)来表示。有时候,我们需要在字符串中嵌套引号,这就引发了单双引号嵌套的问题。本攻略将详细介绍如何正确处理这个问题,并提供两个示例说明。 1. 使用转义字符 一种解决单双引号嵌套问题的方法是使用转义字符(\)。转义字符可以将特殊字符转义为普通字符,…

    other 2023年7月28日
    00
  • 一句sql更新两个表并可更新对应的字段值具体实现

    首先,需要明确的是,一句 SQL 更新两个表并可更新对应的字段值其实是一个比较复杂的操作,需要一定的 SQL 技能和经验。下面是具体实现的攻略: 使用 MySQL 的多表更新语法实现。 MySQL 支持使用多个表进行更新,可以使用 UPDATE 语句完成该操作。示例代码如下: UPDATE table1, table2 SET table1.field1 =…

    other 2023年6月25日
    00
  • PHP编码规范的深入探讨

    PHP编码规范的深入探讨 1. 为什么需要编码规范? 编码规范是一组约定俗成的规则,用于统一团队成员的编码风格和代码结构。它的存在有以下几个重要原因: 可读性和可维护性:编码规范可以提高代码的可读性,使代码更易于理解和维护。统一的代码风格可以减少团队成员之间的理解障碍,提高协作效率。 代码质量:编码规范可以规范代码的结构和命名,减少潜在的bug和错误。良好的…

    other 2023年8月8日
    00
  • unity8个入门代码

    Unity 8个入门代码完整攻略 Unity是一款跨平台的游戏引擎,它可以用于开发2D和3D游戏。本攻略将详细介绍Unity的8入门代码,包括基本概念、代码示例和事项。 基本概念 Unity是一款跨平台的游戏引擎,它可以用于开发2D和3D游戏。Unity使用C#语言编写代码,可以通过编写代码来实现游戏的各种功能。在Unity中,我们可以使用8个入门代码来快速…

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