1
0
mirror of https://github.com/tmrts/go-patterns.git synced 2024-11-21 12:36:07 +03:00

creational/factory: implement factory method pattern

This commit is contained in:
Tamer Tas 2017-02-21 11:30:21 +03:00
parent c851ce7037
commit 4595241f77
2 changed files with 59 additions and 1 deletions

View File

@ -17,7 +17,7 @@ A curated collection of idiomatic design & application patterns for Go language.
|:-------:|:----------- |:------:|
| [Abstract Factory](/creational/abstract_factory.md) | Provides an interface for creating families of releated objects | ✘ |
| [Builder](/creational/builder.md) | Builds a complex object using simple objects | ✘ |
| [Factory Method](/creational/factory.md) | Defers instantiation of an object to a specialized function for creating instances | |
| [Factory Method](/creational/factory.md) | Defers instantiation of an object to a specialized function for creating instances | |
| [Object Pool](/creational/object-pool.md) | Instantiates and maintains a group of objects instances of the same type | ✔ |
| [Singleton](/creational/singleton.md) | Restricts instantiation of a type to one object | ✔ |

58
creational/factory.md Normal file
View File

@ -0,0 +1,58 @@
# 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
```go
package data
import "io"
type Store interface {
Open(string) (io.ReadWriteCloser, error)
}
```
### Different Implementations
```go
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.
```go
s, _ := data.NewStore(data.MemoryStorage)
f, _ := s.Open("file")
n, _ := f.Write([]byte("data"))
defer f.Close()
```