読者です 読者をやめる 読者になる 読者になる

Go言語入門 / golang 入門 デザインパターン Prototype

f:id:nasust:20161122141513p:plain The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) CC3.0

こんにちはnasustです。前回はデザインパターンのFactory MethodをGo言語 / golangでの実装を解説しました。今回もオブジェクト指向デザインパターンをどうやって実現するか解説したいと思います。

Protoypeの実装

Wikipediaデザインパターンを参考にGo言語 / golangで実装しました。

Prototype パターン - Wikipedia

package main

import "fmt"

type Prototype interface {
    S() []int
    PrintValue()
    Copy() Prototype
}

type PrototypeImpl struct {
    Values []int
}

func (prototype *PrototypeImpl) S() []int {
    return prototype.Values
}

func (prototype *PrototypeImpl) Copy() Prototype {
    newValues := make([]int, cap(prototype.Values))
    copy(newValues, prototype.Values)
    return &PrototypeImpl{newValues}
}

func (prototype *PrototypeImpl) PrintValue() {
    fmt.Println("Value :", prototype.Values)
}

func main() {
    prot := &PrototypeImpl{[]int{1, 2, 3, 4, 5}}
    fmt.Println("OrignalVale: ", prot.Values)
    for i := 0; i < 10; i++ {
        tempExample := prot.Copy()
        values := tempExample.S()
        values[0] = prot.Values[0] * i
        values[1] = prot.Values[1] * i
        values[2] = prot.Values[2] * i
        values[3] = prot.Values[3] * i
        values[4] = prot.Values[4] * i
        tempExample.PrintValue()
    }
    fmt.Println("OrignalVale: ", prot.Values)
}

実行すると下記の結果になります。

OrignalVale:  [1 2 3 4 5]
Value : [0 0 0 0 0]
Value : [1 2 3 4 5]
Value : [2 4 6 8 10]
Value : [3 6 9 12 15]
Value : [4 8 12 16 20]
Value : [5 10 15 20 25]
Value : [6 12 18 24 30]
Value : [7 14 21 28 35]
Value : [8 16 24 32 40]
Value : [9 18 27 36 45]
OrignalVale:  [1 2 3 4 5]

Go言語 / golangの場合は演算子で簡単にコピー出来ますが、構造体のフィールドが参照型である場合はシャローコピー(浅いコピー)になるので、ディープコピー(深いコピー)する場合などでコピー用のメソッドが必要になると思います。

因みにGo言語 / golangの値型、参照型は以下の様になります。



Prototypeパターンはサブクラスでコピーの実装に行います。 Go言語 / golangの場合は、JavaのClonebleインターフェイスのclone()に相当する、 interface型のメソッドを用意して、コピーの実装を抽象化することとでPrototypeパターンが出来ます。


Go言語 / golang 入門 目次に戻る

広告を非表示にする