1
0
mirror of https://github.com/tmrts/go-patterns.git synced 2024-11-25 06:26:06 +03:00

creational/builder: implement the abstract factory

This commit is contained in:
DH 2022-02-13 18:11:26 +09:00
parent f978e42036
commit 5fdf4a775d
2 changed files with 56 additions and 1 deletions

View File

@ -15,7 +15,7 @@ A curated collection of idiomatic design & application patterns for Go language.
| Pattern | Description | Status |
|:-------:|:----------- |:------:|
| [Abstract Factory](/creational/abstract_factory.md) | Provides an interface for creating families of releated objects | |
| [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 | ✔ |
| [Object Pool](/creational/object-pool.md) | Instantiates and maintains a group of objects instances of the same type | ✔ |

View File

@ -0,0 +1,55 @@
# Abstract Factory Method Pattern
Abstract Factory method creational design pattern allows providing interface that creating objects without having to specify the exact type of the object that will be created.
## Implementation
The example implementation shows how to make a phone from different copmanies.
### Types
```go
package company
type iCompnayFactory interface {
makePhone() iPhone
}
```
### Different Implementations
```go
package company
type CompnayType int
const (
SAMSNUG CompnayType = iota
APPLE
)
func getCompnayFactory(compnay CompnayType) (iCompnayFactory, error) {
switch compnay {
case SAMSNUG:
return &samsungFactory{}, nil
case APPLE:
return &appleFactory{}, nil
default:
return nil, fmt.Errorf(/* .. */)
}
}
```
## Usage
With the abstract factory method, the user can provide an interface for creating families of releated objects.
```go
appleFactory, _ := getCompnayFactory(APPLE)
applePhone := appleFactory.makePhone();
applePhone.makeCall(/*...*/);
samsungFactory, _ := getCompnayFactory(SAMSNUG)
samsungPhone := samsungFactory.makePhone();
samsungPhone.makeCall(/*...*/);
```