一、原型模式的定義與特點
原型(Prototype)模式:用一個已經(jīng)創(chuàng)建的實例作為原型栖榨,通過復(fù)制原型對象來創(chuàng)建一個和原型相同或相似的新對象
二、原型模式的結(jié)構(gòu)與實現(xiàn)
模式的結(jié)構(gòu)
- 抽象原型類: 規(guī)定了具體原型對象必須實現(xiàn)的接口
- 具體原型類:實現(xiàn)抽象原型類的clone()方法错英,它是可被復(fù)制的對象
- 訪問類:使用具體原型類中的clone()方法來復(fù)制新的對象
模型的實現(xiàn)
原型模式的克隆分為淺克隆和深克隆
//具體原型類
class Realizetype implements Cloneable
{
Realizetype()
{
System.out.println("具體原型創(chuàng)建成功秉宿!");
}
public Object clone() throw CloneNotSuppportedException
{
System.out.println("具體原型復(fù)制成功!")
return (Realizetype)supper.clone();
}
}
//原型模式的測試類
public class PrototypeTest
{
public static void main(String[] args)throws CloneNotSupportedException
{
Realizetype obj1 = new Realizetype();
Realizetype obj2 = (Realizetype)obj1.clone();
System.out.println("obj1==obj2?"+(obj1==obj2));
}
}
三氯迂、Golang實現(xiàn)原型模式
package prototype
//Cloneable 是原型對象需要實現(xiàn)的接口
type Cloneable interface{
Clone() Cloneable
}
type PrototypeManager struct {
prototypes map[string]Cloneable
}
func NewPrototypeManager() *PrototypeManager {
return &PrototypeManager{
prototypes: make(map[string]Cloneable),
}
}
func (p *PrototypeManager) Get(name string) Cloneable {
return p.prototypes[name]
}
func (p *PrototypeManager) Set(name string, prototype Cloneable) {
p.prototypes[name] = prototype
}
測試用例
package prototype
import "testing"
var manager *PrototypeManager
type Type1 struct {
name string
}
func (t *Type1) Clone() Cloneable {
tc := *t
return &tc
}
func TestClone(t *testing.T) {
t1 := manager.Get("t1")
t2 := t1.Clone()
if t1 == t2 {
t.Fatal("error! get clone not working")
}
}
func init() {
manager := NewPrototypeManager()
t1 := &Type1{
name: "type1",
}
manager.Set("t1", t1)
}