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日

相关文章

  • JS中apply()的应用实例分析

    JS中apply()的应用实例分析 什么是apply()? JS中的apply()是Function对象自带的一个方法,它的作用是调用函数并将对象作为第一个参数进行传递,第二个参数是一个包含传递给函数的参数的数组。 语法:function.apply(thisArg, [argsArray]) thisArg:在函数中某个对象将被用作“this”对象。 ar…

    JavaScript 2023年5月28日
    00
  • 原生js实现淘宝购物车功能

    原生js实现淘宝购物车功能的攻略可以分为以下几个步骤: 步骤一:页面结构 首先,我们需要在页面中设置一个存放购物车商品的容器,并给它一个id,方便我们后续在JavaScript中获取到它的元素: <div id="cart-container"> </div> 步骤二:获取数据 接下来,我们需要从后台获取购物车中的…

    JavaScript 2023年6月11日
    00
  • Python编程中运用闭包时所需要注意的一些地方

    当在Python中使用闭包时,有一些注意事项需要注意。在本攻略中,我将介绍一些关键概念和用于实现闭包的Python语法,同时提供两个实例以说明如何使用闭包。 什么是闭包? 简单来说,闭包是指一种能够访问其词法作用域(Lexical Scope)中变量的函数。当内部函数定义在外部函数的作用域中时,它就可以访问外部函数的变量。这使我们能够创建具有“私有”状态的函…

    JavaScript 2023年6月10日
    00
  • JavaScript实现动态添加、移除元素或属性的方法分析

    JavaScript实现动态添加、移除元素或属性的方法分析 动态添加元素 方法一:createElement()方法 我们可以使用createElement()方法来创建一个新的元素节点,然后将该节点添加到文档中的某个元素中作为其子元素。其基本语法为: document.createElement(tagName) 其中,tagName指定新节点的标签名称,…

    JavaScript 2023年6月10日
    00
  • js中闭包结合递归等于柯里化原理解析

    下面是关于”js中闭包结合递归等于柯里化原理解析”的详细讲解。 什么是闭包 闭包是指一个函数能够访问并操作其外部作用域中的变量,即使这些变量已经超出了当前作用域的范围。在JavaScript中,函数是一等公民,可以作为变量、参数、返回值传递。闭包就是Javascript中的一个重要概念,因为它能够让我们在代码编写上更加灵活。 什么是递归 递归是指一个函数在其…

    JavaScript 2023年6月10日
    00
  • js离开或刷新页面检测(且兼容FF,IE,Chrome)

    来讲解一下”js离开或刷新页面检测(且兼容FF,IE,Chrome)”的完整攻略。 1.需求分析 我们需要一种方法来检测用户是否离开或者刷新页面,当用户离开或者刷新时,我们可以采取一些行动,例如制作一个弹窗或者弹出提示框,提醒用户是否确认离开本页。 2.思路分析 监听onunload和onbeforeunload两个事件。 为了兼容FF,IE,Chrome等…

    JavaScript 2023年6月11日
    00
  • vue跳转页面的几种方法(推荐)

    下面是详细讲解“Vue跳转页面的几种方法(推荐)”的完整攻略。 简介 在Vue开发中,页面跳转是非常常见的操作。本文主要介绍Vue跳转页面的几种方法,旨在为Vue初学者提供一些参考。 方法一:Vue-router路由跳转 Vue-router是Vue官方提供的路由管理插件,可以很方便地实现页面的跳转。 步骤如下: 安装Vue-router:在命令行中执行以下…

    JavaScript 2023年6月11日
    00
  • js防止页面被iframe调用的方法

    JS防止页面被iframe调用的方法是一种常用的前端安全技术。当我们的页面被一些不安全的第三方网站运用iframe引入时,会存在一定的安全问题,比如我们网站中的用户信息可能会被第三方页面获取等。因此,我们需要采取相应的安全措施,防止我们的页面被嵌入到非法站点中,这里给出两种常用方式供参考: 方式一:判断当前页面是否在iframe中 if (self !== …

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