Go设计模式原型模式考查点及使用详解

yizhihongxing

Go设计模式原型模式考查点及使用详解

什么是原型模式?

原型模式是一种创建型设计模式,其目的是通过克隆已有的对象来创建新的对象,而不是通过常规的new操作符通过调用构造函数来创建新的对象。原型模式的核心思想是通过使用原型实例来指定新对象的类型,然后通过复制这个原型来创建新的对象。

原型模式在Go语言中很常用,例如当我们需要创建一些相同属性和方法的对象,但是这些对象的具体实现细节可能是不同的。此时,我们可以使用原型模式,并基于原型实例进行复制和修改。

原型模式的考查点

在实际使用原型模式时,我们要考虑以下几个关键点:

  • 原型类需要实现Clone()方法,用于复制自身;
  • 克隆操作可以通过浅拷贝或深拷贝来实现;
  • 原型模式适用于创建相同类型的多个对象,且这些对象的实现细节可能会有所不同;
  • 当需要克隆复杂对象时,我们需要考虑如何正确地处理对象之间的关联关系。

使用原型模式的案例分析

浅拷贝

package main

import (
    "fmt"
)

type Person struct {
    Age int
    Name string
    Addresses []string
}

func (p *Person) Clone() *Person {
    clone := *p
    return &clone
}

func main() {
    p1 := &Person{Age: 20, Name: "Tom", Addresses: []string{"Beijing", "Shanghai"}}
    p2 := p1.Clone()
    p2.Age = 21
    p2.Addresses[0] = "Guangzhou"
    fmt.Printf("p1 = %+v\np2 = %+v\n", p1, p2)
}

输出:

p1 = &{Age:20 Name:Tom Addresses:[Beijing Guangzhou]}
p2 = &{Age:21 Name:Tom Addresses:[Guangzhou Shanghai]}

上面的例子实现了一个Person结构体,并实现了Clone()方法来返回一个Person的克隆对象。在main()函数中,我们先创建一个Person对象p1,然后通过Clone()方法复制p1得到p2。最后,我们对p2的年龄和地址进行修改,并打印出两个对象的值。

其中,从输出结果可以看出,修改之后只有p2的年龄被修改,而地址则是共享的,即修改一个对象的属性会影响到所有克隆出来的对象。

深拷贝

package main

import (
    "fmt"
)

type Address struct {
    Province string
    City string
}

type Person struct {
    Age int
    Name string
    Addresses []*Address
}

func (p *Person) Clone() *Person {
    clone := *p
    clone.Addresses = make([]*Address, len(p.Addresses))
    for i, addr := range p.Addresses {
        clone.Addresses[i] = &Address{Province: addr.Province, City: addr.City}
    }
    return &clone
}

func main() {
    p1 := &Person{
        Age: 20,
        Name: "Tom",
        Addresses: []*Address{
            &Address{Province: "Beijing", City: "Dongcheng"},
            &Address{Province: "Shanghai", City: "Xuhui"},
        },
    }

    p2 := p1.Clone()
    p2.Name = "Jerry"
    p2.Addresses[0].City = "Chaoyang"
    fmt.Printf("p1 = %+v\np2 = %+v\n", p1, p2)
}

输出:

p1 = &{Age:20 Name:Tom Addresses:[0xc000052300 0xc000052320]}
p2 = &{Age:20 Name:Jerry Addresses:[0xc000052340 0xc000052360]}

上面的例子实现了一个包含Address地址列表的Person结构体,使用了深拷贝来复制对象并处理关联关系。

在main()函数中,我们先创建一个Person对象p1,其中包含两个Address对象。接着,我们通过Clone()方法创建p2,然后修改p2的Name和Addresses中第一个元素的City属性,并打印出两个对象的值。

从输出结果可以看出,修改后只有p2的Name和第一个Address的City被修改,而p1的值不变。

总结

原型模式是一种创建型设计模式,其核心思想是通过克隆已有的对象来创建新的对象,而不是通过常规的new操作符调用构造函数来创建新的对象。在实际使用原型模式时,我们需要考虑克隆操作的方式(浅拷贝/深拷贝)、如何处理对象之间的关联关系以及使用场景等因素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go设计模式原型模式考查点及使用详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 如何在 JavaScript 中更好地利用数组

    当涉及到 JavaScript 中的数组时,有一些技巧可以帮助我们更好地使用它们。以下是一些利用数组的技巧,包括代码示例。 数组的创建和初始化 我们可以使用数组字面量创建一个数组,如下所示: const myArray = [1, 2, 3]; 我们还可以使用构造函数 Array() 来创建一个数组。 const myArray = new Array(1,…

    JavaScript 2023年5月27日
    00
  • JS Jquery 遍历,筛选页面元素 自动完成(实现代码)

    下面是关于JS Jquery遍历、筛选页面元素和实现自动完成的攻略。 什么是Jquery? JQuery是一个快速,小巧且功能强大的JavaScript库。它使得处理HTML文档、事件处理、动画和Ajax等操作更加简单和快捷。JQuery提供了具有出色表现的API集合,这些API可用于访问和修改文档的结构与内容,处理事件、动画以及Ajax操作等。 遍历页面元…

    JavaScript 2023年6月11日
    00
  • 使用javascript将时间转换成今天,昨天,前天等格式

    下面是使用 JavaScript 将时间转换成“今天”,“昨天”,“前天”等格式的攻略: 1. 获取时间戳 首先需要获取要转换的时间戳。时间戳是一个整数,表示自1970年1月1日 00:00:00 UTC起经过的毫秒数。可以使用 JavaScript 中的Date对象的getTime()方法获取当前时间的时间戳,如下所示: const timestamp =…

    JavaScript 2023年5月27日
    00
  • php IIS日志分析搜索引擎爬虫记录程序第1/2页

    下面是PHP IIS日志分析搜索引擎爬虫记录程序第1/2页的完整攻略,包含以下几个步骤: 1. 配置IIS日志文件 在进行日志分析前,我们需要在IIS上配置日志文件,以记录用户访问网站的详细信息。可以按照以下步骤进行配置: 打开IIS管理器,在左侧面板中选择您要配置的站点,然后点击“logging”选项卡。 在日志文件目录下新建一个文件夹,用于存放日志文件。…

    JavaScript 2023年5月28日
    00
  • js变量、作用域及内存详解

    JS变量、作用域及内存详解 JavaScript 是一门动态、解释型语言,定义了多种不同类型的值,比如数字、字符串、布尔值、对象等。在 JavaScript 中,变量用于算术计算、字符串拼接、逻辑表达式等各种的场景,变量是引用值和原始值的存储体。 变量 变量的定义与命名规则 在 JavaScript 中,变量的定义使用关键字 var 或 let,如果不带任何…

    JavaScript 2023年6月10日
    00
  • 一个非常强大完整的web表单验证程序Validator v1.05

    Validator v1.05 – 一个强大的web表单验证程序 Validator v1.05 是一个高效,灵活和功能强大的表单验证程序,可以帮助web开发人员轻松地验证使用者提交的表单输入。其主要特点包括: 简单易用:具有清晰的API和文档,易于配置和使用。 强大的验证能力:可以确保输入符合特定格式而且符合业务规则。 可扩展性:可以通过编写自定义插件来进…

    JavaScript 2023年6月10日
    00
  • JavaScript实现获取img的原始尺寸的方法详解

    我来详细讲解“JavaScript实现获取img的原始尺寸的方法详解”的完整攻略。 一、背景说明 在开发网页中,经常需要获取 img 标签的原始尺寸,以便进行响应式布局或者图片的合理展示。对于这种需求,我们可以使用 JavaScript 来获取 img 标签的原始尺寸,本文将介绍几种实现方式。 二、addEventListener 方法 addEventLi…

    JavaScript 2023年6月11日
    00
  • JS正则表达式验证数字代码

    下面我将详细讲解 JS 正则表达式验证数字代码的完整攻略。 步骤 1. 构建正则表达式 首先需要构建一个用于验证数字的正则表达式。一般来说,数字可以包含整数和小数,还可能有正负号。 验证整数和小数的正则表达式如下: /^-?\d+(\.\d+)?$/ 其中: ^ 表示字符串开始 -? 表示可以有一个可选的负号 \d+ 表示至少一个数字 (\.\d+)? 表示…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部