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日

相关文章

  • networkInformation.downlink测用户网速方法详解

    networkInformation.downlink测用户网速方法详解 在当前移动互联网时代,提高用户体验成为互联网公司重中之重,而给用户提供良好的网速体验则是其中关键之一。在前端开发中,我们可以使用 networkInformation.downlink 对用户的网速进行测量,从而更好的优化页面加载速度和改善用户体验。 什么是networkInforma…

    JavaScript 2023年6月11日
    00
  • Textbox控件注册回车事件及触发按钮提交事件具体实现

    Textbox控件注册回车事件及触发按钮提交事件是Web开发中常用的技术之一。下面我将详细讲解如何实现这个功能。 注册回车事件 在Textbox控件中,我们可以向其绑定keypress事件,通过该事件判断当用户按下回车键时执行某些操作,比如提交表单等。下面是一个简单示例: <input type="text" id="my…

    JavaScript 2023年6月11日
    00
  • 使用javascript做在线算法编程

    下面是“使用Javascript做在线算法编程”的完整攻略。 一、概述 在线算法编程指的是通过一个网站或平台提供的在线编程环境,使用一定编程语言完成特定算法题目,将编写的代码提交,经过编译测试后得到结果。Javascript作为一种常用的脚本语言,在线算法编程中也有广泛的应用。 二、步骤 1. 选择合适的在线算法平台 当前,市场上有不少针对在线算法编程的网站…

    JavaScript 2023年5月18日
    00
  • 原生JS实现循环Nodelist Dom列表的4种方式示例

    原生JS实现循环Nodelist Dom列表的4种方式示例的完整攻略如下: 1. 使用for循环遍历Nodelist 可以使用常规的for循环来遍历Nodelist。要遍历Nodelist的所有项,需要使用nodelist.length属性,并使用nodelist.item(index)方法来访问单个元素。 const nodeList = document…

    JavaScript 2023年6月10日
    00
  • JavaScript基础之函数详解

    JavaScript基础之函数详解 本篇攻略将详细讲解JavaScript中函数的相关知识,包括函数的定义、参数、返回值、作用域等内容。如果你刚刚开始学习JavaScript,或者想要加强对函数的理解,本篇攻略将是一个不错的选择。本篇攻略中的所有示例代码均可在浏览器中运行,方便调试和测试。 函数的定义 在JavaScript中定义一个函数通常有两种方式,分别…

    JavaScript 2023年5月17日
    00
  • 给ListBox添加双击事件示例代码

    给ListBox添加双击事件的步骤如下: 1. 添加事件处理方法 在窗体的代码文件中,找到窗体类中的初始化代码(通常是InitializeComponent方法)。 在该方法的末尾添加以下代码,为ListBox对象添加一个名为DoubleClick的事件处理方法: this.listBox1.DoubleClick += new System.EventHa…

    JavaScript 2023年6月11日
    00
  • JS过滤url参数特殊字符的实现方法

    需求分析 首先,我们需要明确的是,过滤 URL 参数中的特殊字符完全可以通过正则表达式来实现。在 JavaScript 中,我们可以使用 RegExp 对象来进行正则表达式的匹配。因此,我们需要编写能够对 URL 参数进行正则匹配的函数并使用该函数过滤掉所有特殊字符。 实现步骤 (1)定义一个过滤 URL 参数特殊字符的函数,例如 cleanURLParam…

    JavaScript 2023年5月19日
    00
  • JavaScript字符串对象(string)基本用法示例

    介绍JavaScript字符串对象(string)基本用法示例的完整攻略如下: 字符串对象简介 Javascript中的字符串对象指的是一串字符序列,可以依据需要进行处理,例如字符串连接、截取等操作。字符串对象是字符的集合,可以按照某些规则排序,由于这些规则是单独定义的,所以JavaScript字符串对象的排序规则与其他语言有所不同。可以使用双引号或单引号来…

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