mirror of
https://github.com/tmrts/go-patterns.git
synced 2024-11-25 06:26:06 +03:00
creational/abstract-factory: implement abstract pattern
This commit is contained in:
parent
418cd23c0a
commit
10f0e2a5a3
88
creational/abstract_factory.go
Normal file
88
creational/abstract_factory.go
Normal file
@ -0,0 +1,88 @@
|
||||
//Source code adapted from https://en.wikipedia.org/wiki/Abstract_factory_pattern
|
||||
//Added "otherOS" in case this code is executed on other os than windows, mac os x
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
type iButton interface {
|
||||
paint()
|
||||
}
|
||||
|
||||
type iGUIFactory interface {
|
||||
createButton() iButton
|
||||
}
|
||||
|
||||
type winFactory struct {
|
||||
}
|
||||
|
||||
func (WF *winFactory) createButton() iButton {
|
||||
return newWinButton()
|
||||
}
|
||||
|
||||
type osxFactory struct {
|
||||
}
|
||||
|
||||
func (WF *osxFactory) createButton() iButton {
|
||||
return newOSXButton()
|
||||
}
|
||||
|
||||
type otherOSFactory struct {
|
||||
}
|
||||
|
||||
func (WF *otherOSFactory) createButton() iButton {
|
||||
return newOtherOSButton()
|
||||
}
|
||||
|
||||
type winButton struct {
|
||||
}
|
||||
|
||||
func (wb *winButton) paint() {
|
||||
fmt.Println("WinButton")
|
||||
}
|
||||
|
||||
func newWinButton() *winButton {
|
||||
return &winButton{}
|
||||
}
|
||||
|
||||
type osxButton struct {
|
||||
}
|
||||
|
||||
func (ob *osxButton) paint() {
|
||||
fmt.Println("OSXButton")
|
||||
}
|
||||
|
||||
func newOSXButton() *osxButton {
|
||||
return &osxButton{}
|
||||
}
|
||||
|
||||
type otherOSButton struct {
|
||||
}
|
||||
|
||||
func (ob *otherOSButton) paint() {
|
||||
fmt.Println("OtherOSButton")
|
||||
}
|
||||
|
||||
func newOtherOSButton() *otherOSButton {
|
||||
return &otherOSButton{}
|
||||
}
|
||||
|
||||
func main() {
|
||||
var factory iGUIFactory
|
||||
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
factory = &winFactory{}
|
||||
break
|
||||
case "darwin":
|
||||
factory = &osxFactory{}
|
||||
break
|
||||
default:
|
||||
factory = &otherOSFactory{}
|
||||
}
|
||||
|
||||
button := factory.createButton()
|
||||
button.paint()
|
||||
}
|
7
creational/abstract_factory.md
Normal file
7
creational/abstract_factory.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Abstract Factory Pattern
|
||||
|
||||
The [abstract factory design pattern](https://en.wikipedia.org/wiki/Abstract_factory_pattern) provides an interface for creating families of releated objects
|
||||
|
||||
# Implementation and Example
|
||||
|
||||
An example with implementation and usage can be found in [abstract_factory.go](abstract_factory.go).
|
Loading…
Reference in New Issue
Block a user