【设计模式】4、prototype 原型模式

这篇具有很好参考价值的文章主要介绍了【设计模式】4、prototype 原型模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

四、prototype 原型模式

https://refactoringguru.cn/design-patterns/prototype

如果希望 复制对象, 可使用 “prototype 模式”

如果 “待复制的对象” 是 interface 而不是 class, 或者如果 class 有 private 变量时. 无法知道 "待复制的对象"的细节, 则需要其实现 “clone()” 方法供外部调用.

4.1 inode

本例希望实现文件系统的复制功能. 数据结构是 inode 接口, file 和 folder 都实现了该接口. 详见 https://refactoringguru.cn/design-patterns/prototype/go/example

当然, 另一条路是: 也可以直接用序列化+反序列化实现复杂对象的 clone()文章来源地址https://www.toymoban.com/news/detail-852256.html

4.1.1 inode_test

package _41inode

import "testing"

func TestInode(t *testing.T) {
	d1 := &directory{
		name:     "json",
		children: []inode{&file{name: "a.json"}, &file{name: "b.json"}},
	}
	d2 := &directory{
		name:     "yaml",
		children: []inode{&file{"c.yaml"}, &file{"d.yaml"}},
	}
	f1 := &file{name: "e.txt"}
	f2 := &file{name: "f.sql"}

	directoryHome := directory{
		name:     "/home",
		children: []inode{d1, d2, f1, f2},
	}
	directoryHome.print(printIndent)

	cp := directoryHome.clone()
	cp.print("  ")
}

// code result
=== RUN   TestInode
  /home
    json
      a.json
      b.json
    yaml
      c.yaml
      d.yaml
    e.txt
    f.sql
  /home_clone
    json_clone
      a.json_clone
      b.json_clone
    yaml_clone
      c.yaml_clone
      d.yaml_clone
    e.txt_clone
    f.sql_clone
--- PASS: TestInode (0.00s)
PASS

4.1.2 inode

package _41inode

// inode 是文件系统的节点
type inode interface {
	// 打印此节点的信息, indent 是缩进符(如\t)
	print(indent string)
	// 复制此节点
	clone() inode
}

const printIndent = "  "

4.1.3 file

package _41inode

import "fmt"

type file struct {
	// 文件名
	name string
}

func (f *file) print(indent string) {
	str := indent + f.name
	fmt.Println(str)
}

func (f *file) clone() inode {
	return &file{name: f.name + "_clone"}
}

4.1.4 directory

package _41inode

import (
	"fmt"
)

type directory struct {
	// 目录名
	name string
	// 子节点
	children []inode
}

func (d *directory) print(indent string) {
	fmt.Println(indent + d.name)
	for _, child := range d.children {
		child.print(indent + printIndent) // 在基础 indent 的基础上, 再添加 printIndent
	}
}

func (d *directory) clone() inode {
	children := make([]inode, 0)
	for _, child := range d.children {
		children = append(children, child.clone())
	}
	cp := &directory{
		name:     d.name + "_clone",
		children: children,
	}
	return cp
}

到了这里,关于【设计模式】4、prototype 原型模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式六:原型模式(Prototype Pattern)

    原型模式是一种创建对象的设计模式。它允许我们通过复制一个现有对象来创建新的对象,而无需知道其具体实现细节。在使用原型模式时,我们首先创建一个原始对象,然后根据需要复制该对象,以获得新创建的对象。 原型模式的主要思想是基于对象的复制。通过使用原型

    2024年02月14日
    浏览(32)
  • 创建型设计模式:5、原型模式(Prototype Pattern)

    目录 1、原型模式的含义 2、C++实现原型模式的简单实例 1、原型模式的含义 通过复制现有对象来创建新对象,而无需依赖于显式的构造函数或工厂方法,同时又能保证性能。 The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is det

    2024年02月13日
    浏览(28)
  • 设计模式之原型模式Prototype的C++实现

    1、原型模式提出 在软件功能设计中,经常面临着“某些结构复杂的对象”的创建工作,且创建的对象想拥有其他对象在某一刻的状态,则可以使用原型模型。原型模型是通过拷贝构造函数来创建对象,并且该对象拥有其他对象在某一刻的状态。 2、需求描述 设计产品A,B,这

    2024年02月12日
    浏览(30)
  • 《Java极简设计模式》第05章:原型模式(Prototype)

    作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/java-simple-design-prototype 沉淀,成长,突破,帮助他人,成就自我。 本章难度:★★☆☆☆ 本章重点:用

    2024年02月11日
    浏览(30)
  • 《golang设计模式》第一部分·创建型模式-02-原型模式(Prototype)

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Prototype(抽象原型类):它是声明克隆方法的接口,或所有具体原型类的公共父类 它可以是抽象类也可以是接口,甚至还可以是具体实现类。 ConcretePrototype(具体原型类):它实现在抽象原型类中声明的

    2024年02月14日
    浏览(29)
  • 【设计模式——学习笔记】23种设计模式——原型模式Prototype(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    原型模式指用通过拷贝原型实例创建新的实例,新实例和原型实例的属性完全一致 原型模式是一种创建型设计模式 工作原理是通过调用原型实例的 clone() 方法来完成克隆,原型实例需要实现Cloneable接口,并重写 clone() 方法 需要为每个类开发一个克隆方法,这对全新的类来说

    2024年02月16日
    浏览(36)
  • JavaScript设计模式(一)——构造器模式、原型模式、类模式

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,正逐渐往全干发展 📃 个人状态: 研发工程师,现效力于中国工业软件事业 🚀 人生格言: 积跬步至千里,积小流成江海 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒

    2024年02月11日
    浏览(32)
  • 【前端知识】JavaScript——设计模式(工厂模式、构造函数模式、原型模式)

    工厂模式是一种众所周知的设计模式,广泛应用于软件工程领域,用于抽象创建特定对象的过程。 优点:可以解决创建多个类似对象的问题 缺点:没有解决对象标识问题(即新创建的对象是什么类型) 示例: 构造函数模式与工厂模式相比,没有显式地创建对象,其属性和方

    2024年02月15日
    浏览(37)
  • 二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道

    在软件开发中,我们经常需要创建和复制对象。然而,有时候直接创建对象可能会导致性能下降或代码重复。为了解决这些问题,原型模式应运而生。而使用原型管理器(Prototype Manager)来集中管理原型对象可以进一步提高灵活性和可维护性。本文将详细介绍原型管理器的用

    2024年02月07日
    浏览(42)
  • JAVA设计模式----原型设计模式

    定义 :用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型 :创建类模式 类图 : 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包