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

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日

相关文章

  • HTML5中视频音频的使用详解

    HTML5中视频音频的使用详解 HTML5提供了一种在网页中嵌入音频和视频的新方法,使得开发者可以更好地控制和展示媒体内容。本篇攻略将为您详细讲解如何在HTML5中使用音频和视频。 视频标签 HTML5 提供了一个用于嵌入视频的 “video” 标签。如下所示: <video controls> <source src="movi…

    JavaScript 2023年6月11日
    00
  • 用Axios Element实现全局的请求loading的方法

    下面是使用Axios Element实现全局请求loading的方法的攻略。 什么是Axios Element Axios Element是基于Axios封装的一个插件,使得我们可以很方便地对Axios进行增强和自定义操作。 实现全局请求loading的方法 我们可以将全局请求loading的实现分为以下几个步骤: 1. 安装Axios Element 我们…

    JavaScript 2023年6月11日
    00
  • JavaScript使用slice函数获取数组部分元素的方法

    获取数组部分元素是在我们日常的编程中非常常见的操作,JavaScript提供了slice()函数帮助我们实现这个功能。接下来我将为大家详细介绍slice函数的使用方法。 一、slice()函数概述 slice()函数用于获取数组的某一部分元素,它不会修改原数组,而是返回一个新的数组。slice()函数有两个参数,分别是起始索引和结束索引,其中起始索引是要获取…

    JavaScript 2023年5月27日
    00
  • C#设置或验证PDF文本域格式的方法详解

    C#设置或验证PDF文本域格式的方法详解 介绍 PDF文本域是指在PDF文档中提供的一种可编辑的文本框,用户可以输入文本或选择选项。如果需要对PDF文本域的格式进行设置或验证,那么就需要使用C#编写代码来实现。 本文将详细讲解如何使用C#设置或验证PDF文本域格式,包括以下内容: 创建PDF文本域 设置PDF文本域格式 验证PDF文本域格式 创建PDF文本域…

    JavaScript 2023年5月19日
    00
  • JavaScript如何实现元素全排列实例代码

    让我来为您详细讲解如何通过JavaScript实现元素全排列。 前置知识 在学习元素全排列之前,您需要掌握以下内容: JavaScript基础知识(变量、函数等) 递归算法 实现思路 下面是实现元素全排列的思路: 将数组的第一个元素与其他元素交换位置,得到一个新的数组。 对新数组中的除第一个元素外的剩余元素进行全排列,得到新的排列方式。 将第一个元素与其他元…

    JavaScript 2023年5月28日
    00
  • javascript 注释代码的几种方法总结

    JavaScript 注释代码是为了在代码中加入一些标注或解释,方便程序员或其他人员阅读代码。注释代码在开发过程中起到了非常重要的作用。本文将详细讲解 JavaScript 注释代码的几种方法总结。 单行注释 使用单行注释的方法在注释行前加上双斜杠 “//”。单行注释只会注释单独一行代码。例如: var name = "张三"; // 定…

    JavaScript 2023年5月27日
    00
  • JavaScript中的数组操作介绍

    当谈到JavaScript时,数组(Array)通常是最常用的数据结构之一。尤其在现代Web开发中,数组操作非常重要。下面我们将详细介绍JavaScript中的数组操作,内容包括以下几点: 声明和初始化数组 常用的数组操作方法 数组迭代器 示例 1. 声明和初始化数组 在JavaScript中声明和初始化数组有多种方式。最常见的方式是使用Array构造函数来…

    JavaScript 2023年5月18日
    00
  • 浅谈Ajax相关及其优缺点

    浅谈Ajax相关及其优缺点 什么是Ajax Ajax全称为Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),是一种用于创建现代Web应用的技术。它可以让网页在不刷新的情况下向服务器发送请求,获取数据并作出相应的动态更新。 Ajax的优缺点 优点 异步请求:可以在不刷新页面的情况下与服务器通信,否则需要…

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