1. 概念
1.1 简述
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
1.2 角色
- Prototype(抽象原型类):它是声明克隆方法的接口,或所有具体原型类的公共父类
它可以是抽象类也可以是接口,甚至还可以是具体实现类。
- ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
- Client(客户类):
让一个原型对象克隆自身从而创建一个新的对象,只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。
1.3 类图
楼比的简书用不了mermaid
,以下代码放在这备用。
classDiagram
Client --> Prototype
Prototype <|.. ConcretePrototype
class Prototype{
<<interface>>
+Clone() Prototype
}
class ConcretePrototype{
+Clone() Prototype
}
class Client{
}
2. 代码示例
2.1 设计
- 创建一个
将军
类- 它有4个方法:
设置人员信息
、设置装备
、查询
、克隆
- 它有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{
}