设计模式-原型模式详解

文章目录

  • 前言
  • 理论基础
    • 1. 原型模式定义
    • 2. 原型模式角色
    • 3. 原型模式工作过程
    • 4. 原型模式的优缺点
  • 实战应用
    • 1. 原型模式适用场景
    • 2. 原型模式实现步骤
    • 3. 原型模式与单例模式的区别
  • 原型模式的变体
    • 1. 带有原型管理器的原型模式
    • 2. 懒汉式单例模式的原型模式实现
    • 3. 细粒度原型模式
  • 总结

前言

  • 简介设计模式
  • 设计模式是在软件开发中常见问题的解决方案,它们是经过实践和经验总结出来的可重用的设计思想和解决方案。设计模式通过提供通用的架构、原则和指导,帮助开发人员更有效地编写高质量的代码。
    设计模式分为三个主要类别:
  1. 创建型模式:关注对象的创建过程,包括如何实例化对象,隐藏对象的创建细节以及对象的复制和克隆。
  2. 结构型模式:关注对象和类的组合方式,以实现更大结构的目标,例如类之间的关系。
  3. 行为型模式:关注类和对象间的交互和通信方式,以实现更好的协作和控制。
  • 原型模式简介
    原型模式是创建型模式的一种,它关注对象的复制和克隆。在某些情况下,通过传统的实例化方式创建新对象可能会非常昂贵或复杂。这时,原型模式提供了一种替代方法,通过克隆已有的对象来创建新对象,从而避免了昂贵的初始化过程。

原型模式通过使用克隆方法来生成新对象,可以节省资源和时间,并提高对象创建的效率。它适用于需要创建大量相似对象的场景,同时也具有良好的扩展性,可以根据需要通过继承和重写克隆方法来实现自定义的克隆逻辑。

总结起来,原型模式是一种通过克隆现有对象来创建新对象的设计模式。它提供了一种灵活、高效的对象创建方式,可以在某些场景下显著提高代码的复用性和可维护性。
在这里插入图片描述

理论基础

1. 原型模式定义

原型模式是一种创建型设计模式,它允许通过克隆现有对象来创建新对象,而无需依赖于传统的实例化过程。该模式通过复制现有对象的属性和状态,创建新的独立对象,并且可以根据需要修改其特定属性。

在原型模式中,我们定义一个抽象原型类,其中包含一个用于克隆对象的抽象方法。具体原型类则继承自抽象原型类,并实现了克隆方法,以便返回自身的克隆副本。客户端代码使用具体原型类的实例,并调用其克隆方法来创建新的对象。

原型模式的关键思想是通过已存在的对象来创建新的对象,而不是从头开始进行全新的实例化过程。通过克隆现有对象,可以避免重复的初始化工作和资源消耗,提高对象创建的效率。同时,原型模式也使得对象的创建更加灵活,可以根据需要进行修改和定制。

2. 原型模式角色

  • 抽象原型类
  • 具体原型类
  • 客户端

3. 原型模式工作过程

4. 原型模式的优缺点

实战应用

1. 原型模式适用场景

  • 对象初始化过程耗时较多
  • 类初始化需要消耗很多资源
  • 通过new的方式创建对象比较复杂
  • 需要避免使用类的子类来进行初始化配置

2. 原型模式实现步骤

  • 创建抽象原型类
  • 创建具体原型类
  • 创建客户端类

3. 原型模式与单例模式的区别

原型模式的变体

1. 带有原型管理器的原型模式

  • 带有原型管理器的原型模式:
    带有原型管理器的原型模式是对原型模式的扩展,它引入了一个原型管理器(Prototype Manager)来集中管理原型对象。原型管理器充当一个注册表,用于存储和获取各种原型对象。

这种变体的原型模式可以更方便地创建和管理多个不同类型的原型对象。客户端可以通过原型管理器获取所需的原型对象,而不需要自己显式地调用克隆方法。原型管理器可以在内部维护一个原型对象的集合,并根据需要进行复制和返回。

  • 带有原型管理器的原型模式代码实现:
import java.util.HashMap;
import java.util.Map;// 原型接口
interface Prototype {Prototype clone();
}// 具体原型类 A
class ConcretePrototypeA implements Prototype {private String name;public ConcretePrototypeA(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {return new ConcretePrototypeA(this.name);}
}// 具体原型类 B
class ConcretePrototypeB implements Prototype {private int number;public ConcretePrototypeB(int number) {this.number = number;}public int getNumber() {return number;}@Overridepublic Prototype clone() {return new ConcretePrototypeB(this.number);}
}// 原型管理器
class PrototypeManager {private Map<String, Prototype> prototypes;public PrototypeManager() {prototypes = new HashMap<>();}public void registerPrototype(String key, Prototype prototype) {prototypes.put(key, prototype);}public Prototype getPrototype(String key) {Prototype prototype = prototypes.get(key);if (prototype != null) {return prototype.clone();}return null;}
}// 客户端
public class Main {public static void main(String[] args) {PrototypeManager manager = new PrototypeManager();manager.registerPrototype("A", new ConcretePrototypeA("Prototype A"));manager.registerPrototype("B", new ConcretePrototypeB(10));Prototype prototypeA = manager.getPrototype("A");if (prototypeA != null) {System.out.println("Clone A: " + ((ConcretePrototypeA) prototypeA).getName());}Prototype prototypeB = manager.getPrototype("B");if (prototypeB != null) {System.out.println("Clone B: " + ((ConcretePrototypeB) prototypeB).getNumber());}}
}

2. 懒汉式单例模式的原型模式实现

  • 懒汉式单例模式的原型模式:
    懒汉式单例模式是一种常见的单例模式实现方式,它延迟实例化单例对象,直到第一次使用时才创建。将懒汉式单例模式与原型模式结合起来,可以实现一种延迟加载并复用实例的模式。

在这种变体的原型模式中,单例对象充当原型对象,当客户端第一次请求获取实例时,会通过克隆来获得对象的副本,并将其作为单例对象返回。之后,每次请求都将返回这个已存在的副本,避免了重复的创建和初始化过程。

这种实现方式结合了懒加载和对象的复用,可以在需要的时候动态创建新对象并缓存起来,提高了系统的性能和资源利用率。

  • 懒汉式单例模式的原型模式代码实现:
// 单例类
class Singleton {private static Singleton instance;// 私有构造函数private Singleton() {System.out.println("Singleton instance created.");}// 获取单例对象public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}// 克隆方法@Overrideprotected Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException("Cannot clone a singleton object.");}
}// 客户端
public class Main {public static void main(String[] args) {Singleton singleton1 = Singleton.getInstance();Singleton singleton2 = Singleton.getInstance();System.out.println("Singleton 1: " + singleton1);System.out.println("Singleton 2: " + singleton2);// 尝试克隆单例对象try {Singleton clone = (Singleton) singleton1.clone();System.out.println("Clone: " + clone);} catch (CloneNotSupportedException e) {System.out.println(e.getMessage());}}
}

3. 细粒度原型模式

  • 细粒度原型模式:
    细粒度原型模式是指将一个复杂对象拆分成多个部分,并为每个部分创建对应的原型对象。这样,在需要使用某个部分时,只需要克隆该部分的原型对象即可,而不需要克隆整个复杂对象。

细粒度原型模式可以提高系统的灵活性和效率。它允许客户端选择需要的部分进行克隆,而不需要克隆整个对象。同时,当某个部分发生变化时,只需要修改对应的原型对象,而不需要重新创建整个对象。

这种模式适用于那些由多个组件或模块组成的复杂对象。通过细粒度的原型对象,可以更加灵活地构建和修改复杂对象的组成部分,减少了代码的重复和耦合度。

  • 细粒度原型模式代码
// 原型接口
interface Prototype {Prototype clone();
}// 具体原型类 A
class ConcretePrototypeA implements Prototype {private String name;public ConcretePrototypeA(String name) {this.name = name;}public String getName() {return name;}@Overridepublic Prototype clone() {return new ConcretePrototypeA(this.name);}
}// 具体原型类 B
class ConcretePrototypeB implements Prototype {private int number;public ConcretePrototypeB(int number) {this.number = number;}public int getNumber() {return number;}@Overridepublic Prototype clone() {return new ConcretePrototypeB(this.number);}
}// 客户端
public class Main {public static void main(String[] args) {Prototype prototypeA = new ConcretePrototypeA("Prototype A");Prototype cloneA = prototypeA.clone();if (cloneA instanceof ConcretePrototypeA) {System.out.println("Clone A: " + ((ConcretePrototypeA) cloneA).getName());}Prototype prototypeB = new ConcretePrototypeB(10);Prototype cloneB = prototypeB.clone();if (cloneB instanceof ConcretePrototypeB) {System.out.println("Clone B: " + ((ConcretePrototypeB) cloneB).getNumber());}}
}

总结

  • 原型模式使用总结
  • 原型模式对于软件开发的重要性
// 抽象原型类
abstract class Prototype implements Cloneable {public abstract Prototype clone();
}// 具体原型类
class ConcretePrototype extends Prototype {@Overridepublic Prototype clone() {try {return (Prototype) super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}// 客户端
public class Client {public static void main(String[] args) {ConcretePrototype prototype = new ConcretePrototype();ConcretePrototype clone = (ConcretePrototype) prototype.clone();// 进行操作}
}

以上代码展示了原型模式的简单实现,其中抽象原型类定义了一个抽象方法clone,在具体原型类中实现了这个方法,并通过调用super.clone()方法进行对象的克隆。在客户端中,可以创建一个原型对象并进行克隆,从而得到一个新的对象进行操作。

原型模式适用于需要创建大量相似对象的场景,通过克隆已有对象来提高效率。它简化了对象的创建过程,减少了重复的初始化操作。同时,原型模式也具有良好的可扩展性,可以通过继承和重写clone方法来实现自定义的克隆逻辑。

总的来说,原型模式是一种简单而实用的设计模式,在软件开发中具有广泛的应用价值。通过合理地运用原型模式,可以提高代码的复用性、可维护性和灵活性,从而提高软件开发的效率和质量。

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

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

相关文章

FPGA时序分析与约束(1)——组合电路时序

写在最前面&#xff1a; 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭&#xff0c;似乎只有理解了时序约束才能算是真正入门了FPGA&#xff0c;对于FPGA从业者或者未来想要从事FPGA开发的工程师来说&#xff0c;时序约束可以说是一道躲不过去的坎&#xff0c;所以从这篇…

CSS魔术师Houdini,用浏览器引擎实现高级CSS效果

开门见山&#xff0c;直接上货 &#x1f50d; CSS Houdini是什么&#xff1f; “Houdini”一词引用自“Harry Houdini”&#xff0c;他是一位20世纪的著名魔术师&#xff0c;亦被称为史上最伟大的魔术师、逃脱术师及特级表演者。 我们都知道&#xff0c;浏览器在渲染网页显示样…

异或和大小比较类问题——抓住最高位:CF1863F

https://codeforces.com/contest/1863/problem/F 因为有等于&#xff0c;所以考虑异或和为0的合法区间&#xff0c;它可以随意切现在考虑切开后左边大于右边&#xff0c;可以发现左右边最高位可以互相抵消&#xff0c;似乎不太可做&#xff1f;此时可以换个考虑&#xff0c;考…

抖音企业号无需API开发连接AI图像生成,打造AI智能绘图助手

1. 抖音用户使用场景&#xff1a; 作为抖音企业号的运营人员&#xff0c;我们一直在寻找新的方式来增强我们与用户之间的互动。最近&#xff0c;我们发现了AI绘图技术可以根据用户需求和指令自动创建图片&#xff0c;无需人为干预&#xff0c;这为我们节省了人力和时间。因此&a…

node 如何下载任意版本

开门见山啦 第一步&#xff1a;打开node官网 Node.js 第二步&#xff1a;点击下载 进入下面的页面&#xff0c;然后往下滑&#xff0c;点击 All download options 查看以往所有的版本号&#xff1a; 这样就可以按自己的需求下载对应的node版本啦 或者 &#xff1a; 最简单…

Elasticsearch:为什么从 Elasticsearch 7.0.0 及更高版本中删除了映射类型 type?

在 Elasticsearch 7.0.0 或更高版本中创建的索引不再接受 _default_ 映射。 在 6.x 中创建的索引将继续在 Elasticsearch 6.x 中像以前一样运行。 7.0 中的 API 中已弃用类型 type&#xff0c;并对索引创建、放置映射、获取映射、放置模板、获取模板和获取字段映射 API 进行了重…

c#事件(event)

概述&#xff1a; C#中的事件是一种特殊的委托&#xff0c;它用于实现观察者模式&#xff0c;允许对象在特定事件发生时通知其他对象。 以下是使用C#事件的示例&#xff1a; 首先&#xff0c;定义一个包含事件的类&#xff1a; public class EventPublisher {// 声明一个事…

海格里斯HEGERLS高密度料箱式四向穿梭车存储系统有哪些显著优势?

近些年仓储货架向着自动化、智能化发展&#xff0c;因此市面上出现很多不同类型的智能自动化仓储货架。其中&#xff0c;最受企业青睐的便是四向穿梭车货架。四向穿梭车货架根据其载重不同可分为托盘式和料箱式两大类。这两种不同类型的四向穿梭车货架在结构形式和控制方式上基…

git 提交错误,回滚到某一个版本

git log 查看版本号 commit 后面跟的就是版本号git reset --hard 版本号 &#xff08;就可以回滚到你要去的版本&#xff09;git push -f &#xff08;因为本地回滚了&#xff0c;所以和远程会差几个版本。所以这时候只有强制推送&#xff0c;覆盖远程才可以&#xff09;

Tauri打包windows应用配置中文界面

使用 Tauri Rust 开发桌面应用&#xff0c;在 windows 系统上&#xff0c;打包后安装包名称后缀、安装界面、相关说明默认都是英文的。如果要默认显示为中文&#xff0c;则需要在 tauri.conf.json 中配置相应参数。 前言 默认情况下&#xff0c;在 windows 系统打完的 mis 包…

一图胜千言!数据可视化多维讲解(Python)

数据聚合、汇总和可视化是支撑数据分析领域的三大支柱。长久以来&#xff0c;数据可视化都是一个强有力的工具&#xff0c;被业界广泛使用&#xff0c;却受限于 2 维。在本文中&#xff0c;作者将探索一些有效的多维数据可视化策略&#xff08;范围从 1 维到 6 维&#xff09;。…

手游排行前十名,手游排行榜2023前十名

今天为大家带来手游排行前十名&#xff0c;如今流行的手机游戏专注于在画面和游戏性方面为玩家提供更逼真、更流畅的游戏体验。在画面方面&#xff0c;手游开发商经常使用先进的游戏引擎和技术来提高游戏的图形质量和细节&#xff0c;以及增加游戏的动态照明和物理效果&#xf…

【论文阅读】自动驾驶中车道检测系统的物理后门攻击

文章目录 Abstract1.Introduction2.Background2.1.DNN-based Lane Detection2.2.Backdoor Attacks2.3.Threat Model2.4.Image Scaling 4.Evaluation4.1.Poison-Annotation Attack4.2.Clean-Annotation Attack4.3.Real-world Evaluation4.4.Bypassing Existing Defenses 论文题目…

C语言每日一练----Day(12)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;最大连续1的个数 完全数计算 &#x1f493;博主csdn个人主页&#xff1…

Dolphin for Mac(Wii游戏模拟器)配置指南

Wii模拟器Dolphin Mac是款适合Mac电脑中的游戏玩家们使用的模拟器工具。Wii模拟器Dolphin Mac官方版支持直接运行游戏镜像文件&#xff0c;玩家可以将游戏ISO拷贝到某一个文件夹中统一进行管理。Wii模拟器Dolphin Mac除了键盘和鼠标外&#xff0c;还支持配合原版的Wii遥控器操作…

origin导出pdf曲线超出边框

软件版本 软件版本Word2021Origin2021Adobe Acrobat Pro2023 问题描述 Origin导出的emf格式矢量图片&#xff0c;插入到Word中&#xff0c;显示正常&#xff0c;但是在使用Word导出→创建Adobe PDF→创建Adobe PDF导出PDF文件后&#xff0c;图片曲线就会超出边框&#xff0c…

面试题——网络IO模型

一、socket socket是在应用层和传输层中间的抽象层&#xff0c;它把传输层&#xff08;TCP/UDP&#xff09;的复杂操作抽象成一些简单的接口&#xff0c;供应用层调用实现进程在网络中的通信。Socket起源于UNIX&#xff0c;在Unix一切皆文件的思想下&#xff0c;进程间通信就被…

[Mac软件]Adobe After Effects 2023 v23.5 中文苹果电脑版(支持M1)

After Effects是动画图形和视觉效果的行业标准。由运动设计师、平面设计师和视频编辑用于创建复杂的动画图形和视觉上吸引人的视频。 创建动画图形 使用预设样式为文本和图形添加动画效果&#xff0c;或逐帧调整它们。编辑、添加深度、制作动画或转换为可编辑的路径&#xff…

HCIP---BGP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 根据AS自治系统可以将动态路由协议划分为IGP和EGP协议。IGP协议是应用在AS内部&#…

四旋翼飞行器基本模型(MatlabSimulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…