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:
parent
c851ce7037
commit
4595241f77
@ -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
58
creational/factory.md
Normal 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()
|
||||
```
|
Loading…
Reference in New Issue
Block a user