当前位置: 首页 > news >正文

简谈设计模式之原型模式

原型模式是一种创建型设计模式, 用于创建对象, 而不必指定它们所属的具体类. 它通过复制现有对象 (即原型) 来创建新对象. 原型模式适用于当创建新对象的过程代价较高或复杂时, 通过克隆现有对象来提高性能

原型模式结构
  • 原型接口. 声明一个克隆自身的接口
  • 具体原型. 实现克隆的具体方法
  • 客户端. 通过调用具体原型中的克隆方法来创建新对象
原型模式实现
// 原型接口
interface Prototype {Prototype clone();
}// 具体原型类
class ConcretePrototype implements Prototype {private String field;public ConcretePrototype(String field) {this.field = field;}// 实现克隆方法@Overridepublic Prototype clone() {return new ConcretePrototype(this.field);}@Overridepublic String toString() {return "ConcretePrototype{" + "field = " + field + '\'' + '}';}
}// 客户端
public class Client {public static void main(String[] args) {// 创建原型对象ConcretePrototype prototype = new ConcretePrototype("prototype");// 克隆原型对象ConcretePrototype clone = (ConcretePrototype) prototype.clone();System.out.println(prototype);System.out.println(clone);}
}

在原型模式中, 克隆可以分为浅拷贝和深拷贝

  • 浅拷贝: 复制对象时, 只复制对象本身的基本数据类型字段和对象的引用, 而不复制引用对象本身
  • 深拷贝: 复制对象时, 不仅复制对象本身的基本数据类型字段和对象的引用, 还复制所有引用对象, 递归地进行复制

下面是深拷贝和浅拷贝的实例

浅拷贝:

import java.util.ArrayList;
import java.util.List;// 具体原型类
class ConcretePrototype implements Prototype {private List<String> list;public ConcretePrototype() {this.list = new ArrayList<>();}public void addItem(String item) {this.list.add(item);}@Overridepublic Prototype clone() {try {return (ConcretePrototype) super.clone(); // 浅拷贝} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}@Overridepublic String toString() {return "ConcretePrototype{" + "list=" + list + '}';}
}

深拷贝:

import java.util.ArrayList;
import java.util.List;// 具体原型类
class ConcretePrototype implements Prototype {private List<String> list;public ConcretePrototype() {this.list = new ArrayList<>();}public void addItem(String item) {this.list.add(item);}@Overridepublic Prototype clone() {ConcretePrototype clone = new ConcretePrototype();clone.list = new ArrayList<>(this.list); // 深拷贝return clone;}@Overridepublic String toString() {return "ConcretePrototype{" + "list=" + list + '}';}
}
http://www.lryc.cn/news/399424.html

相关文章:

  • CentOS7.X系统部署Zabbix6.0版本(可跟做)
  • QT文件生成可执行的exe程序
  • 【ZooKeeper学习笔记】
  • 220V降5V芯片输出电压电流封装选型WT
  • AWS S3 基本概念
  • [XCUITest] 处理iOS权限点击授权 有哪些权限?
  • 宪法学学习笔记(个人向) Part.5
  • C语言的指针与数组
  • 计算机图形学入门28:相机、透镜和光场
  • Swift 基于Codable协议使用
  • conda激活的虚拟环境的python版本不对应
  • 深度学习概览
  • 什么是白盒测试中的静态测试?其包含哪些过程和方法?
  • 搭建一个高并发的Web商品推荐系统,如何涉及软件架构?
  • 今日科技圈最新时事新闻(2024年7月12日
  • jenkins系列-09.jpom构建java docker harbor
  • 构造+贪心,CF 432E,Square Tiling
  • 【Linux】任务管理
  • 计算机网络——常见问题汇总
  • Linux的世界 -- 初次接触和一些常见的基本指令
  • [AI 大模型] Meta LLaMA-2
  • Python3.6.6 OpenCV 将视频中人物标记或者打马赛克或加图片并保存为不同格式
  • Readiris PDF Corporate / Business v23 解锁版安装教程 (PDF管理软件)
  • .NET MAUI开源架构_2.什么是 .NET MAUI?
  • 认知偏差知识手册
  • SpringBoot后端代码基本逻辑
  • Python学生信息管理系统的设计与实现
  • 最优雅的PHP框架 Laravel
  • log4j2的日志框架(详细,springboot和异步日志的实现)
  • taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)