Factory Method Pattern

Factory method creational design pattern allows creating objects without having to specify the exact type of the object that will be created.

Implementation

The example implementation shows how to provide a data store with different backends such as in-memory, disk storage.

Types

package data

import "io"

type Store interface {
    Open(string) (io.ReadWriteCloser, error)
}

Different Implementations

package data

type StorageType int

const (
    DiskStorage StorageType = 1 << iota
    TempStorage
    MemoryStorage
)

func NewStore(t StorageType) Store {
    switch t {
    case MemoryStorage:
        return newMemoryStorage( /*...*/ )
    case DiskStorage:
        return newDiskStorage( /*...*/ )
    default:
        return newTempStorage( /*...*/ )
    }
}

Usage

With the factory method, the user can specify the type of storage they want.

s, _ := data.NewStore(data.MemoryStorage)
f, _ := s.Open("file")

n, _ := f.Write([]byte("data"))
defer f.Close()