java原型模式 (Prototype Pattern) 介绍

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有的实例来创建新对象,而不是通过实例化类来创建对象。这个模式允许你创建对象时避免复杂的初始化步骤,并且能够动态地创建对象的副本。

原型模式的关键点

  1. 原型接口:声明一个clone方法,用于复制对象。
  2. 具体原型类:实现原型接口并实现clone方法,通常使用Object类的clone方法来进行浅复制。
  3. 客户端:通过调用原型对象的clone方法来创建新的对象。

原型模式的优点

  • 避免重复初始化:可以通过复制一个现有对象来创建新对象,而不需要重新进行复杂的初始化。
  • 动态创建对象:可以在运行时动态决定创建的对象类型。
  • 减少子类数量:通过克隆机制可以减少对象创建时需要的子类数量。
import java.util.HashMap;
import java.util.Map;// 原型接口
abstract class Shape implements Cloneable {private String id;protected String type;abstract void draw();public String getType(){return type;}public String getId() {return id;}public void setId(String id) {this.id = id;}// 实现Cloneable接口的clone方法public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;}
}// 具体原型类:圆形
class Circle extends Shape {public Circle(){type = "Circle";}@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}// 具体原型类:正方形
class Square extends Shape {public Square(){type = "Square";}@Overridepublic void draw() {System.out.println("Drawing a Square");}
}// 原型管理器
class ShapeCache {private static Map<String, Shape> shapeMap = new HashMap<String, Shape>();public static Shape getShape(String shapeId) {Shape cachedShape = shapeMap.get(shapeId);return (Shape) cachedShape.clone();}// 对每种形状都运行数据库查询,并创建该形状// shapeMap.put(shapeKey, shape);// 例如,我们要添加三种形状public static void loadCache() {Circle circle = new Circle();circle.setId("1");shapeMap.put(circle.getId(), circle);Square square = new Square();square.setId("2");shapeMap.put(square.getId(), square);}
}// 客户端代码
public class PrototypePatternDemo {public static void main(String[] args) {ShapeCache.loadCache();Shape clonedShape1 = (Shape) ShapeCache.getShape("1");System.out.println("Shape : " + clonedShape1.getType());clonedShape1.draw();Shape clonedShape2 = (Shape) ShapeCache.getShape("2");System.out.println("Shape : " + clonedShape2.getType());clonedShape2.draw();}
}

示例说明

  1. Shape类:作为原型接口,定义了一个clone方法用于复制对象,并且包含了idtype属性。
  2. Circle和Square类:具体原型类,实现了Shape类,并实现了draw方法。
  3. ShapeCache类:原型管理器,负责存储和访问原型对象。loadCache方法用于预加载一些原型对象到缓存中。
  4. PrototypePatternDemo类:客户端代码,通过ShapeCache来获取复制的对象,并调用其方法。

这种模式在需要频繁创建相似对象的场景中非常有用,比如游戏开发中的对象生成、复杂对象的初始化等。通过原型模式,可以极大地提高对象创建的效率并减少重复代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/14764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python导入Shapefile到PostGIS的常见问题和解决方案

导入Shapefile到PostGIS的常见问题和解决方案 先决条件&#xff1a; 已经拥有含有GDAL的python环境&#xff08;如果大家需要&#xff0c;我可以后面出一片文章 问题一&#xff1a;QGIS连接到PostGIS数据库失败 错误描述&#xff1a; Connection to server at &quo…

Vue3实战笔记(40)—组件逻辑复用:自定义Hooks的完全指南

文章目录 前言一、状态管理二、副作用处理三、 生命周期钩子总结 前言 自定义Hooks是Vue3中的一个重要特性&#xff0c;它允许您创建可重用的函数&#xff0c;以便在组件之间共享状态和逻辑。以下是一些关于自定义Hooks的常见用法。 一、状态管理 使用reactive或ref来创建响应…

题解:CF1969B(Shifts and Sorting)

题解&#xff1a;CF1969B&#xff08;Shifts and Sorting&#xff09; 一、题目翻译 给定一个二进制字符串&#xff0c;你可以将其中一个子段&#xff08;注意不是子串&#xff0c;是连续的&#xff09;进行循环移位——将最后一个字符放在第一个字符之前&#xff0c;其代价为…

2024 CCF国际AIOps挑战赛·赛题与赛制解读

本文根据本届挑战赛程序委员会主席、中国科学院计算机网络信息中心副研究员裴昶华在2024 CCF国际AIOps挑战赛线下宣讲会上为《2024 CCF国际AIOps挑战赛赛题与赛制》的分享整理而成&#xff0c;全文分为挑战赛背景介绍、题目简介、流程说明和评分规则等部分&#xff0c;最后简要…

别对我动心短视频:成都鼎茂宏升文化传媒公司

别对我动心短视频&#xff1a;时代的爱情哲学与心理探索 在短视频的海洋里&#xff0c;"别对我动心"这样的标题&#xff0c;如同一颗石子投入平静的湖面&#xff0c;激起了层层涟漪。它不仅仅是对一段情感的拒绝&#xff0c;更是一种现代人情感态度的表达&#xff0…

14 vue学习:透传Attributes

Attributes 继承 “透传 attribute”指的是传递给一个组件&#xff0c;却没有被该组件声明为 [props]或 [emits]的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。 当一个组件以单个元素为根作渲染时&#xff0c;透传的 attribute 会自动被添加到根元…

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(2)

1.问题描述&#xff1a; 怎么判断登录的华为帐号有变动&#xff1f; 解决方案&#xff1a; 华为帐号登录成功后会返回唯一标识OpenID和UnionID&#xff0c;如果切换不同的华为帐号登录&#xff0c;这个唯一标识会变。 OpenID是华为帐号用户在不同类型的产品的身份ID&#x…

JWT Authorization header using the Bearer scheme

文章目录 引言I Json web token (JWT)1.1 JWT1.2 authentication_schemes(token authentication)1.3 SecurityScheme的实现II Swagger添加bearer token参数2.1 Swagger效果2.2 .net core Swagger实现Bearer Authentication2.3 java OpenAPI 3.0实现Bearer Authentication2.4 …

【全部更新完毕】2024长三角数学建模A题思路代码文章教学-“抢救”落水手机

文章摘要部分&#xff1a; “抢救”落水手机 摘要 文章主要探讨了如何科学地处理和搜索在水体中意外掉落的物品&#xff1a;华为 Mate 60 Pro手机和居民身份证。本文基于物理模型和动力学分析&#xff0c;为不同水体环境中的掉落物品提供了详尽的搜索策略和打捞建议。 本文…

[安洵杯 2019]crackMe

直接就退出程序了 找到关键函数了&#xff0c;好像用到了 hook 还有一个 嘿嘿&#xff0c;看着就是像 base64 只是 补‘’改成了‘ &#xff01; ’ 交叉引用啊&#xff0c;翻到一个应该是最后比较函数 1UTAOIkpyOSWGv/mOYFY4R!! 那一坨对 a1数组的操作没看懂 先总结一下就是…

SpringBoot搭建Eureka注册中心

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 1、Spring-Cloud Euraka介绍 Spring-Cloud Euraka是Spring Cloud集合中一…

vue3 + vite 实用依赖与配置

mark一下日常 vue3 vite 项目配置 实用依赖与配置 1. amfe-flexible&#xff08;2&#xff09;安装&#xff08;3&#xff09;使用 2. postcss-pxtorem&#xff08;1&#xff09;介绍&#xff08;2&#xff09;安装&#xff08;3&#xff09;使用 3. autoprefixer&#xff08;…

Convolutional Occupancy Networks【ECCV2020】

论文&#xff1a;https://arxiv.org/pdf/2003.04618 代码&#xff1a;GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1&#xff1a;卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构&#xff0c;表现能力…

继承初级入门复习

注意&#xff1a;保护和私有在类中没有区别&#xff0c;但是在继承中有区别&#xff0c;private在继承的子类不可见&#xff0c;protect在继承的子类可见 记忆方法&#xff1a;先看基类的修饰符是private&#xff0c;那都是不可见的。如果不是&#xff0c;那就用继承的修饰和基…

对this对象的理解

This 是指函数被调用是的上下文&#xff0c;它指向最后一次调用这个方法的对象。this的值并不是在函数定义时确定的&#xff0c;而是在函数被调用时确定的。在实际开发中&#xff0c;this 的指向一般可以通过四种调用模式来判断。 1、函数调用 当一个函数不是一个对象的属性时…

使用keepalived实现mysql主从复制的自动切换

使用Keepalived实现MySQL主从复制的自动切换通常涉及配置一个虚拟IP&#xff08;VIP&#xff09;作为MySQL服务器对客户端的访问点。Keepalived会监控MySQL主服务器的健康状况&#xff0c;如果主服务器宕机&#xff0c;Keepalived会自动将虚拟IP移至备用服务器&#xff0c;从而…

鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(上)

在鸿蒙的广袤开发世界中,网络层作为信息交换的桥梁,其重要性不言而喻。今天,我将带领大家一同探索如何以艺术般的手法,优雅地封装鸿蒙官方的网络库,为我们的应用搭建一个高效、灵活的网络层。我们在下一篇章中,将深入阐述如何利用这一封装完善的网络库,轻松驾驭网络层的…

gstreamer Windows常见问题汇总

需要先安装gstreamer , 再编译opencv。https://gstreamer.freedesktop.org/download/&#xff0c;都需要安装。 OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK 2.x or Carbon support. If you are on Ubuntu or D…

肌肤暗沉与胶原蛋白:解锁透亮肌肤的秘密

&#x1f338;亲爱的小仙女们&#xff0c;今天我们来聊聊肌肤暗沉与胶原蛋白之间的神秘联系。你是不是也曾为肌肤的暗沉而烦恼&#xff1f;其实&#xff0c;很多时候&#xff0c;肌肤的暗沉不仅仅是外部因素造成的&#xff0c;更与肌肤内部的胶原蛋白含量密切相关。&#x1f31…

C++ 变量类型与转换

C 变量类型与转换 文章目录 C 变量类型与转换变量int_tsize_t与ssize_tpid_ttime_t typenametypeid关键字类型转换编译期类型转换std::static_cast注意事项运行时类型转换std::dynamic_cast 变量 int_t 它是通过typedef定义的&#xff0c;而不是一种新的数据类型。 - int8_t…