Skip to content

Latest commit

 

History

History

prototype

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Prototype pattern

  • 원본 객체를 복사하여 객체를 생성(클론)
  • 클라이언트 코드에서 어떤 클래스의 인스턴스를 만드는 것인지 모르는 상태에서 새로운 인스턴스를 생성할 수 있음

Structure

기초 구현

image

레지스트리 구현

image

Example

type Manager struct {
	registry map[string]Monster
}

func NewManager() *Manager {
	return &Manager{registry: make(map[string]Monster)}
}

func (m *Manager) Register(name string, monster Monster) {
	m.registry[name] = monster
}

func (m *Manager) Create(prototype string) Monster {
	return m.registry[prototype].Clone()
}

type WellKnownMonster struct {
    name string
}

func NewWellKnownMonster(postfix string) WellKnownMonster {
    return WellKnownMonster{name: "wkm" + postfix}
}

func (m WellKnownMonster) Print() {
    fmt.Println(m.name)
}

func (m WellKnownMonster) Clone() Monster {
    return NewWellKnownMonster("_clone")
}

func main() {
    manager := monster.NewManager()
    
    wellKnownMonster := monster.NewWellKnownMonster("")
    dynamicPlayerMonster := monster.NewDynamicPlayerMonster("")
    
    manager.Register("wkm", wellKnownMonster)
    manager.Register("dpm", dynamicPlayerMonster)
    
    wellKnownMonster.Print() // wkm
    wellKnownMonsterClone := manager.Create("wkm")
    wellKnownMonsterClone.Print() // wkm_clone
}

Reference