diff --git a/study_go/design_pattern/1_simple_factory/README.md b/study_go/design_pattern/1_simple_factory/README.md new file mode 100644 index 0000000..c22538a --- /dev/null +++ b/study_go/design_pattern/1_simple_factory/README.md @@ -0,0 +1,23 @@ +# UML + +```mermaid +classDiagram + class Product { + <> + +operation() + } + class ConcreteProductA { + +operation() + } + class ConcreteProductB { + +operation() + } + class SimpleFactory { + +createProduct(string) Product + } + Product <|.. ConcreteProductA + Product <|.. ConcreteProductB + SimpleFactory ..> Product + SimpleFactory ..> ConcreteProductA + SimpleFactory ..> ConcreteProductB +```` \ No newline at end of file diff --git a/study_go/design_pattern/1_simple_factory/main.go b/study_go/design_pattern/1_simple_factory/main.go new file mode 100644 index 0000000..84bba2d --- /dev/null +++ b/study_go/design_pattern/1_simple_factory/main.go @@ -0,0 +1,46 @@ +package main + +import "fmt" + +// Product 接口 +type Product interface { + Operation() string +} + +// ConcreteProductA 结构体 +type ConcreteProductA struct{} + +func (p *ConcreteProductA) Operation() string { + return "ConcreteProductA" +} + +// ConcreteProductB 结构体 +type ConcreteProductB struct{} + +func (p *ConcreteProductB) Operation() string { + return "ConcreteProductB" +} + +// SimpleFactory 结构体 +type SimpleFactory struct{} + +func (f *SimpleFactory) CreateProduct(productType string) Product { + switch productType { + case "A": + return &ConcreteProductA{} + case "B": + return &ConcreteProductB{} + default: + return nil + } +} + +func main() { + factory := &SimpleFactory{} + + productA := factory.CreateProduct("A") + fmt.Println(productA.Operation()) + + productB := factory.CreateProduct("B") + fmt.Println(productB.Operation()) +}