JAVA设计模式(三)-原型

news/2024/12/28 11:46:44/

JAVA设计模式(三)-原型

本篇文章主要讲下java 创建型设计模式中的原型模式.

何谓原型模式: 简单来说就是 将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。

使用原型模式,就可以简化实例化的过程, 不必依赖于构造函数或者new关键字.

由于java 提供了clone方法, 原型设计模式的实现就很简单了.

原型模式的要素:

  1. 原型接口(Prototype Interface): 定义了克隆方法的接口.该方法用于复制现有对象并创建新对象。
  2. 原型类(Concrete Prototype Class): 实现了克隆方法,来复制自身

1: 原型类

具体的实现如下:

package com.zh.xpose;import java.util.List;/*** @Author: zh* @Time: 23-12-22.* @Email:* @Describe:*/
public class ConcretePrototype implements Cloneable{private String name;private List<String> fields;public ConcretePrototype(String name,List<String> fields) {System.out.println("原型创建成功");this.name =name;this.fields =fields;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<String> getFields() {return fields;}public void setFields(List<String> fields) {this.fields = fields;}@Overrideprotected Object clone() throws CloneNotSupportedException {System.out.println("原型复制成功");return (ConcretePrototype)super.clone();}
}
public class JavaTest {public static void main(String[] args) {		ArrayList<String> list = new ArrayList<>();list.add("age");list.add("sex");ConcretePrototype concretePrototype = new ConcretePrototype("person",list);ConcretePrototype clone = null;try {clone= (ConcretePrototype) concretePrototype.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}System.out.println(concretePrototype==clone);System.out.println(concretePrototype.getName() == clone.getName());System.out.println(concretePrototype.getFields() == clone.getFields());}
}

输出如下:

exclude patterns:
原型创建成功
原型复制成功
false
true
true

2: 浅克隆和深克隆

浅克隆只会复制原型对象本身,而不会复制它所引用的对象。也就是说,克隆对象和原型对象会共享引用对象。如果原型对象中的引用对象发生改变,克隆对象中的引用对象也会发生改变。

深克隆会复制原型对象以及它所引用的对象。也就是说,克隆对象和原型对象拥有各自独立的引用对象。无论原型对象中的引用对象是否发生改变,克隆对象中的引用对象都不会受到影响。

关于浅克隆:

验证如下:

		concretePrototype.setName("test111");list.add("第三个了");concretePrototype.setFields(list);System.out.println(concretePrototype.getName()+"  "+clone.getName());System.out.println(concretePrototype.getFields().size()+"  "+clone.getFields().size());

可以看到 当原型类中的list 发生变更时, clone同时发生了变更.

test111  person
3  3

实现深克隆的方式有两种: 通过实现Cloneable接口和通过序列化.

这里通过修改上面的实现类中的clone方法,来实现深克隆.

package com.zh.xpose;import java.util.ArrayList;
import java.util.List;/*** @Author: zh* @Time: 23-12-22.* @Email:* @Describe:*/
public class ConcretePrototype implements Cloneable{private String name;private List<String> fields;public ConcretePrototype(String name,List<String> fields) {System.out.println("原型创建成功");this.name =name;this.fields =fields;}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<String> getFields() {return fields;}public void setFields(List<String> fields) {this.fields = fields;}@Overrideprotected Object clone() throws CloneNotSupportedException {System.out.println("原型复制成功");ConcretePrototype clone = (ConcretePrototype) super.clone();clone.setName(new String(name));clone.setFields(new ArrayList<>(fields));return clone;}
}

重新执行验证代码 ,结果输出如下:

原型创建成功
原型复制成功
false
false
false
test111  person
3  2

http://www.ppmy.cn/news/1279588.html

相关文章

【设计模式】命令模式

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式&#xff1f; 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …

【聊天程序】

1.服务端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <poll.h>#define IP "192.168.122.156" #define PORT 8888 #def…

Hago 的 Spark on ACK 实践

作者&#xff1a;华相 Hago 于 2018 年 4 月上线&#xff0c;是欢聚集团旗下的一款多人互动社交明星产品。Hago 融合优质的匹配能力和多样化的垂类场景&#xff0c;提供互动游戏、多人语音、视频直播、 3D 虚拟形象互动等多种社交玩法&#xff0c;致力于为用户打造高效、多样、…

让生活更智能,P1600边缘智能网关带你进入智能家居新时代

一、什么是P1600边缘智能网关&#xff1f; 在科技日新月异的今天&#xff0c;我们的生活已经被各种智能产品所包围。而在这个智能化的浪潮中&#xff0c;P1600边缘智能网关以其独特的优势&#xff0c;成为了智能家居的重要组成部分。那么&#xff0c;什么是P1600边缘智能网关呢…

机器学习---比较单个学习器与Bagging集成的偏差-方差分解、在Iris数据集的不同特征子集上使用不同的分类器进行训练和可视化

1. Bagging 说明并比较了预期均方误差的偏差方差分解&#xff0c;单个学习器与bagging集成的比较。 在回归中&#xff0c;估计器的预期均方误差可以根据偏差、方差和噪声进行分解。 在回归问题的数据集上的平均值上&#xff0c;偏差项测量估计器的预测与问题的最佳可能估计器…

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点&#xff0c;关于vue的路由守卫。也就是鉴权&#xff0c;不是所有的组件任何人都可以访问到的&#xff0c;需要权限&#xff0c;而根据权限…

HarmonyOS - 基础组件绘制

文章目录 所有组件开发 tipsBlankTextImageTextInputButtonLoadingProgress 本文改编自&#xff1a;<HarmonyOS第一课>从简单的页面开始 https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667360160710997 所有组件 在 macOS 上&#xff0c;组…

蓝桥杯2020年4月青少组Python程序设计省赛真题

1、小明带两个妹妹参加元宵灯会。别人问她们多大了&#xff0c;她们调皮地说:“我们俩的年龄之积是年龄之和的6倍小明又补充说:“她们可不是双胞胎&#xff0c;年龄差肯定也不超过8岁啊。请你写出:小明的较小的妹妹的年龄。 2、用下面的语句&#xff0c;输出下图 for i in ran…