设计模式之原型模式

miloyang
0 评论
/ /
445 阅读
/
1580 字
22 2023-11

简介

原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。原型模式的核心思想是基于已有的对象创建新的对象,从而避免了创建过程中的一些复杂逻辑。

在原型模式中,存在一个原型对象,我们通过复制这个原型对象来创建新的对象。原型对象通常实现一个克隆方法(Clone),用于生成新的对象,并复制原型对象的状态。这样,我们就可以通过复制而非实例化的方式创建新的对象。

jugelizi 不知道举啥例子,理解为复制,深拷贝。

Demo

type Prototype interface {
    Name() string
    Clone() Prototype
}

func NewConcretePrototype(name string) *ConcretePrototype {
    return &ConcretePrototype{name: name}
}

type ConcretePrototype struct {
    name string
}

func (c *ConcretePrototype) Name() string {
    return c.name
}

func (c *ConcretePrototype) Clone() Prototype {
    return &ConcretePrototype{
        name: c.name,
    }
}

test

func TestPrototype(t *testing.T) {
    // 创建原型对象
    prototype := NewConcretePrototype("milo")

    // 克隆原型对象
    clone1 := prototype.Clone()

    // 源对象修改后不影响clone后的对象
    prototype.name = "miloyang"

    fmt.Println(prototype.name)
    fmt.Println(clone1.Name())
}

作用和场景

  • 简化对象的创建过程

    通过克隆而非实例化,避免了一些创建过程中的复杂逻辑,使得创建新对象更加简便。

  • 动态配置对象

    可以通过克隆原型对象,并在克隆的基础上修改部分属性,实现动态配置对象。

  • 减少子类的生成

    对于某些类,如果其实例之间的差异仅在于一些属性的值,可以通过克隆原型对象来避免生成大量的子类。

如果对象之间的差异主要体现在一些属性的值,而创建对象的过程相对复杂,可以考虑使用原型模式。

如果一个对象的构造函数包含了很多复杂的逻辑,而创建过程中大部分逻辑是相似的,可以考虑使用原型模式,通过克隆来简化创建过程。

如果希望在运行时动态地配置对象,而不是静态配置,可以使用原型模式。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步