第一部分·创建型模式-02-原型模式(Prototype)

1. 概念

1.1 简述

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

1.2 角色

  • Prototype(抽象原型类):它是声明克隆方法的接口,或所有具体原型类的公共父类

它可以是抽象类也可以是接口,甚至还可以是具体实现类。

  • ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
  • Client(客户类):

让一个原型对象克隆自身从而创建一个新的对象,只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。

1.3 类图

image.png

楼比的简书用不了mermaid,以下代码放在这备用。

classDiagram
  Client --> Prototype
  Prototype <|.. ConcretePrototype
  class Prototype{
  <<interface>>
  +Clone() Prototype
  }
  class ConcretePrototype{
    +Clone() Prototype
  }
  class Client{
  }

2. 代码示例

2.1 设计

  • 创建一个将军
    • 它有4个方法:设置人员信息设置装备查询克隆
  • 调用
    • 实例化一个将军关羽
    • 关羽克隆方法实例化继承人
    • 继承人设置人员信息方法修改继承人的信息

2.2 代码

package main

import "fmt"

// 定义抽象原型
type Prototype interface {
    Clone() Prototype
}
//定义具体原型
type ConcretePrototype struct {
    Name   string
    ModelA string
    ModelB string
}

func (c *ConcretePrototype) Clone() Prototype {
    pN := &ConcretePrototype{
        Name:   c.Name,
        ModelA: c.ModelA,
        ModelB: c.ModelB,
    }
    return pN
}

func main() {
    //实例化一个原型
    prototype := &ConcretePrototype{
        Name:   "liubei",
        ModelA: "AAA",
        ModelB: "BBB",
    }
    //用原型复制两个实例
    cloneA := prototype.Clone()
    cloneB := prototype.Clone()
    //查看结果
    fmt.Println(cloneA, cloneB)
}

2.3 类图

classDiagram
  Client --> Prototype
  Prototype <|.. ConcretePrototype
  class Prototype{
  <<interface>>
  +Clone() Prototype
  }
  class ConcretePrototype{
    +String Name
    +String ModelA
    +String ModelB
    +Clone() Prototype
  }
  class Client{
  }
image.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容