【设计模式】腾讯面经:原型模式怎么理解?

什么是原型模式?

设计模式是编程世界的基石,其中原型模式无疑是一种常用而又高效的创建对象的手段。那么,什么是原型模式呢?又该如何去实现它?

在软件工程中,原型模式是一种创建型设计模式。我们可以这样理解:如果创建一个新的对象成本较高,原型模式允许我们复制一个已存在的对象,而非从新构造,这相当于做了一次克隆操作。这就在一定程度上避开了构造函数的约束,极大地提升了程序的执行效率。

img

原型模式的实现

GO

下面,我们通过Go语言来演示一下原型模式的具体实现。

我们需要创建一个Animal接口,有一个Clone方法代表创建一个自我复制:

type Animal interface {
    Clone() Animal
    GetName() string
}

然后我们定义a Dog结构体并实现Animal接口:

type Dog struct {
    name string
}

func (d *Dog) Clone() Animal {
    return &Dog{name: d.name}
}

func (d *Dog) GetName() string {
    return d.name
}

func NewDog(name string) Animal {
    return &Dog{name: name}
}

克隆操作只是简单地复制了Dog的name字段。

接下来我们就可以进行克隆操作:

func main (){
	original := NewDog("Max")
	
	clone := original.Clone()
    fmt.Println(clone.GetName()) // Output: Max
}

您可以看到,我们没有通过构造函数创造新的对象,而是直接通过克隆得到新的对象。

Java

首先,我们需要创建一个抽象的Animal接口,这个接口定义了cloneAnimal方法,表示创建一个自我副本。

public interface Animal extends Cloneable {
    Animal cloneAnimal();
    String getName();
}

然后,我们创建一个Dog类,实现了Animal接口。

public class Dog implements Animal {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    @Override
    public Animal cloneAnimal() {
        return new Dog(name);
    }

    @Override
    public String getName() {
        return name;
    }
}

在Dog类的cloneAnimal方法中,我们通过new Dog(name)复制了一个Dog对象。

下面我们就可以进行克隆操作了:

public class TestPrototype {
    public static void main(String[] args) {
        Dog original = new Dog("Max");
        Dog clone = (Dog) original.cloneAnimal();
        System.out.println(clone.getName()); // Output: Max
    }
}

你可以看到,使用原型模式,我们可以非常简单地创建一个新对象,而无需显式地使用构造函数。这样可以提高程序的性能,特别是在大量创建对象时。

优缺点

原型模式的优点主要体现在,它可以减少系统中类的数量,当一个类的实例之间的状态没有变化时,可以使用原型模式进行复制和拷贝,无需再创建对象,节省了系统资源。

而它的缺点则在复制复杂对象时显现得比较明显,对象之间存在深层次的引用关系,简单复制可能会导致一系列问题,增加了开发的复杂度。

与其他设计模式的比较

原型模式和工厂模式?

原型模式和工厂模式都属于创建型设计模式,但它们的关注点并不同。原型模式注重复制已有的实例,减少新对象的创建工作。工厂模式则是注重通过共通的接口创建新实例,去实现对象的创建和使用的解耦合。

原型和单例模式?

原型模式和单例模式可以有些对立。单例模式强调系统内只能有一个实例,而原型模式则是鼓励对象的复制。

原型模式和克隆模式有什么区别和联系?

原型模式和克隆模式其实在很多情况下是一回事,他们都是基于已存在对象生成新的对象。原型模式是一种创建型设计模式,它指的是通过复制一个已存在的实例来返回新的实例,而这个复制的过程,就是我们通常所说的克隆。所以,克隆的概念通常是作为实现原型模式的一种手段。

当我们讨论“克隆”时,通常会分为“浅克隆”和“深克隆”两种:

  • 浅克隆:创建一个新的对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制;如果字段是引用类型,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一对象。
  • 深克隆:创建一个新的对象,并对其进行递归复制,不只是将当前对象的非静态字段复制到该新对象,而且还要将字段指向的所有对象都进行复制。所以,原始对象及其副本不引用同一对象。

总的来说,无论是原型模式,还是浅克隆、深克隆,他们的核心思想都是根据一个已存在的对象,快速地生成一个新的对象。这种方式特别适合于创建复杂对象或者创建对象的成本较大的情况。

总结

原型模式是设计模式中一个相当实用的模式,它帮助我们在保证性能的同时,完成对象的生成。它简化了对象的创建,提高了对象的复用性,但同时我们也要注意其所带来的问题。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「JavaSE」抽象类接口2

🎇个人主页:Ice_Sugar_7 🎇所属专栏:快来卷Java啦 🎇欢迎点赞收藏加关注哦! 抽象类&接口2 🍉接口间的继承🍉接口的应用🍉总结 🍉接口间的继承 和类的继承…

Pyside6中QTableWidget使用

目录 一:介绍: 二:演示 一:介绍: 在 PySide6 中,QTableWidget 是一个用于展示和编辑表格数据的控件。它提供了在窗口中创建和显示表格的功能,并允许用户通过单元格来编辑数据。 要使用 QTabl…

黑马Java——面向对象进阶(static继承)

1.static静态变量 静态变量是随着类的加载而加载的,优先与对象出现的

Kotlin 开发环境配置指南

一、下载与安装 Kotlin 编译器 步骤 1:获取最新版 Kotlin 编译器 要配置 Kotlin 开发环境,首先需要从 JetBrains 官方 GitHub 仓库下载最新的 Kotlin 编译器。访问以下链接以获取最新版本的编译器: [https://github.com/JetBrains/kotlin/…

Severstal公司的汉语名字是什么,是一家什么样的公司?

问题描述:Severstal公司的汉语名字是什么,是一家什么样的公司? 问题解答: Severstal 公司的中文名字通常被翻译为 "谢韦尔钢铁公司"。这家公司是俄罗斯的一家大型钢铁和矿业企业,总部位于莫斯科。Seversta…

libtorch学习第六

构建卷积网络 #include<torch/torch.h> #include<torch/script.h> #include<iostream>using std::cout; using std::endl;class LinearBnReluImpl : public torch::nn::Module { private:torch::nn::Linear ln{ nullptr };torch::nn::BatchNorm1d bn{ nullp…

[Python] glob内置模块介绍和使用场景(案例)

Unix glob是一种用于匹配文件路径的模式&#xff0c;它可以帮助我们快速地找到符合特定规则的文件。在本文中&#xff0c;我们将介绍glob的基本概念、使用方法以及一些实际应用案例。 glob介绍 Glob(Global Match)是Unix和类Unix系统中的一种文件名扩展功能&#xff0c;它可以…

分布式锁的实现方式

分布式锁是指分布式环境下&#xff0c;系统部署在多个机器中&#xff0c;实现多进程分布式互斥的一种锁。实现分布式锁有三种主流方式&#xff0c;接下来一一盘点。 盘点之前要说说选择时的优缺点 数据库实现的锁表完全不推荐。 Redis分布式锁性能优于ZooKeeper&#xff0c;因…

01、领域驱动设计:微服务设计为什么要选择DDD总结

目录 1、前言 2、软件架构模式的演进 3、微服务设计和拆分的困境 4、为什么 DDD适合微服务 5、DDD与微服务的关系 6、总结 1、前言 我们知道&#xff0c;微服务设计过程中往往会面临边界如何划定的问题&#xff0c;不同的人会根据自己对微服务的理 解而拆分出不同的微服…

通过 GScan 工具自动排查后门

一、简介 GScan 是一款为安全应急响应提供便利的工具&#xff0c;自动化监测系统中常见位置。 工具运行环境&#xff1a;CentOS (6、7) python (2.x、3.x) 工具检查项目&#xff1a; 1、主机信息获取 2、系统初始化 alias 检查 3、文件类安全扫描 3.1、系统重要文件完整行…

JS进阶-深入对象(二)

拓展&#xff1a;深入对象主要介绍的是Js的构造函数&#xff0c;实例成员&#xff0c;静态成员&#xff0c;其中构造函数和Java种的构造函数用法相似&#xff0c;思想是一样的&#xff0c;但静态成员和实例成员和java种的有比较大的差别&#xff0c;需要认真理解 • 创建对象三…

Switch用法以及新特性-最全总结版

本篇文章参考了大佬文章&#xff0c;感谢大佬无私分享&#xff1a; http://t.csdnimg.cn/MjZnX http://t.csdnimg.cn/QFg0x 目录 一、Switch用法&#xff1a;JDK7及以前 1.1、举例一&#xff1a; 1.2、举例二&#xff1a; 二、Switch穿透&#xff1a; 2.1、举例&#xf…

三极管的奥秘:如何用小电流控制大电流

双极性晶体管&#xff08;英语&#xff1a;bipolar transistor&#xff09;&#xff0c;全称双极性结型晶体管&#xff08;bipolar junction transistor, BJT&#xff09;&#xff0c;俗称三极管&#xff0c;是一种具有三个引脚的电子元器件。 本文是讲述的是三极管的基础知识…

基于openssl v3搭建ssl安全加固的c++ tcpserver

1 概述 tcp server和tcp client同时使用openssl库&#xff0c;可对通信双方流通的字节序列进行加解密&#xff0c;保障通信的安全。本文以c编写的tcp server和tcp client为例子&#xff0c;openssl的版本为v3。 2 安装openssl v3 2.1 安装 perl-IPC-Cmd openssl项目中的co…

企业内部知识库搭建教程,赶紧收藏起来

在企业运营中&#xff0c;内部知识库搭建是一项重要的挑战&#xff0c;并需要合理的规划与管理。尤其对于中大型企业&#xff0c;内部知识库能够提高工作效率&#xff0c;减轻员工工作压力与突发事件的处理的困扰。下面给大家提供一份完整的内部知识库搭建教程&#xff0c;快看…

UE4运用C++和框架开发坦克大战教程笔记(十五)(第46~48集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十五&#xff09;&#xff08;第46~48集&#xff09; 46. 批量加载 UClass 功能测试批量加载多个同类 UClass 资源 47. 创建单个资源对象测试加载并创建单个 UClass 资源对象 48. 创建同类资源对象 46. 批量加载 UClass 功能 逻…

Leetcode1143. 最长公共子序列

解题思路 求两个数组或者字符串的最长公共子序列问题&#xff0c;肯定是要用动态规划的。下面的题解并不难&#xff0c;你肯定能看懂。 首先&#xff0c;区分两个概念&#xff1a;子序列可以是不连续的&#xff1b;子数组&#xff08;子字符串&#xff09;需要是连续的&#xf…

rabbitmq基础-java-3、Fanout交换机

1、简介 Fanout&#xff0c;英文翻译是扇出。 2、 特点 1&#xff09; 可以有多个队列 2&#xff09; 每个队列都要绑定到Exchange&#xff08;交换机&#xff09; 3&#xff09; 生产者发送的消息&#xff0c;只能发送到交换机 4&#xff09; 交换机把消息发送给绑定过的…

3d模型怎么分辨材质?--模大狮模型网

在3D模型中&#xff0c;通常可以通过以下几种方式来分辨材质&#xff1a; 视觉检查&#xff1a;在3D渲染视图或预览窗口中&#xff0c;您可以直接观察模型的外观来区分不同的材质。不同的材质可能具有不同的颜色、纹理、反射率等特征&#xff0c;因此通过直观的视觉检查&#x…

网络通信课程总结(小飞有点东西)

27集 局域网通信&#xff1a;用MAC地址 跨局域网通信&#xff1a;用IP地址&#xff08;MAC地址的作用只是让我们找到网关&#xff09; 又因为arp技术&#xff0c;可以通过MAC地址找到IP地址&#xff0c;所以我们可以通过IP地址定位到全世界任意一台计算机。 28集 在数据链路…