gof 23 클래스 모드 만 들 기 (golang 버 전)
github 환영 스타
https://github.com/transienth...
단일 모드
자바 에서 의 단일 모델 의 실현 은 굶 주 린 사람 식, 게 으 른 사람 식, 더 블 잠 금, 정적 내부 류, 매 거 진 등 형식 이 있 을 수 있 습 니 다. go 에서 어떻게 단일 사례 를 실현 할 수 있 습 니까? 먼저 가장 간단 한 형식 으로 높 은 병발 을 고려 하지 않 고 어떻게 실현 해 야 합 니까?
package main
var m *Singleton
type Singleton struct {
}
func GetInstance() *Singleton {
if m == nil {
m = &Singleton{}
}
return m
}
문 제 는 동시 다발 할 때 여러 대상 을 찾 아 해결 방안 에 자 물 쇠 를 채 우 는 것 이다.
package main
import (
"sync"
)
var instance *Singleton
var lock *sync.Mutex = &sync.Mutex{}
type Singleton struct {
}
func GetInstance() *Singleton {
lock.Lock()
defer lock.Unlock()
if instance != nil {
instance = &Singleton{}
}
return instance
}
go 언어 특성, 보다 편리 한 잠 금 추가 지원: sync. Once
package main
import (
"sync"
)
var (
instance *Singleton
lock *sync.Mutex = &sync.Mutex{}
once sync.Once
)
type Singleton struct {
}
func GetInstance() *Singleton {
once.Do(func() {
instance = &Singleton{}
})
return instance
}
단순 공장 모드
간단 한 공장 모델 로 생산 되 는 제품 은 고정 적 이 고 사 과 를 생산 하려 면 MakeApple () 의 방법 이 있다.귤 을 생산 하려 면 메 이 크 오렌지 (MakeOrange) 방법 이 있어 요.
package creation
type FruitFactory interface {
makeApple() Apple
makeOrange() Orange
}
type Apple struct {
desc string
}
type Orange struct {
desc string
}
type Factory struct {
}
func (this Factory) MakeApple() Apple {
return Apple{" "}
}
func (this Factory) MakeOrange() Orange {
return Orange{" "}
}
client
package main
import (
"gof23/creation"
"fmt"
)
func main() {
factory := creation.Factory{}
apple := factory.MakeApple()
orange := factory.MakeOrange()
fmt.Println(apple)
fmt.Println(orange)
}
공장 방법 모델
공장 방법 모델 (Factory Method Pattern) 은 공장 모델 이 라 고도 부 르 고 가상 구조 기 (Virtual Constructor) 모델 또는 다 중 공장 (Polymorphic Factory) 모델 이 라 고도 부 르 며 클래스 생 성 모델 에 속한다.공장 방법 모델 에서 공장 부 류 는 제품 대상 을 만 드 는 공공 인 터 페 이 스 를 정의 하고 공장 자 류 는 구체 적 인 제품 대상 을 생 성 하 는 것 을 책임 진다. 이렇게 하 는 목적 은 제품 류 의 정례 화 작업 을 공장 자 류 로 지연 시 키 는 것 이다. 즉, 공장 자 류 를 통 해 어떤 구체 적 인 제품 류 를 예화 해 야 하 는 지 확인 하 는 것 이다.
package creation
type FruitPicker interface {
MakeFruit() Fruit
}
type Fruit interface {
}
type Banana struct {
desc string
}
type BananaPicker struct {
}
func (this BananaPicker) MakeFruit(fruitName string) Fruit {
switch fruitName {
case "banana":
return Banana{" "}
default:
return Apple{" "}
}
}
client
package main
import (
"gof23/creation"
"fmt"
)
func main() {
bananaPicker := creation.BananaPicker{}
banana := bananaPicker.MakeFruit("banana")
fmt.Println(banana)
}
추상 공장 모드
공장 방법 모델 에서 구체 적 인 공장 은 구체 적 인 제품 을 생산 하 는 것 을 책임 지고 모든 구체 적 인 공장 은 하나의 구체 적 인 제품 에 대응 하 며 공장 방법 도 유일 성 을 가진다. 일반적인 상황 에서 구체 적 인 공장 에는 하나의 공장 방법 이나 한 조 의 무 거 운 공장 방법 만 있다.그러나 때때로 우 리 는 하나의 공장 이 하나의 제품 대상 이 아니 라 여러 개의 제품 대상 을 제공 할 수 있어 야 한다.
공장 방법 모델 을 더욱 명확 하 게 이해 하기 위해 서 는 먼저 두 가지 개념 을 도입 해 야 한다.
제품 등급 구조: 제품 등급 구 조 는 바로 제품 의 계승 구조 이다. 예 를 들 어 추상 적 인 유형 은 텔레비전 이다. 그 하위 유형 은 하 이 얼 텔레비전, 하 이 신 텔레비전, TCL 텔레비전 이 있 으 면 추상 적 인 텔레비전 과 구체 적 인 브랜드 의 텔레비전 간 에 제품 등급 구 조 를 구성 했다. 추상 적 인 텔레비전 은 부류 이 고 구체 적 인 브랜드 의 텔레비전 은 그 부류 이다.제품 족: 추상 적 인 공장 모델 에서 제품 족 은 같은 공장 에서 생산 한 것 으로 서로 다른 제품 등급 구조 에 있 는 제품 을 말한다. 예 를 들 어 하 이 얼 전기 공장 에서 생산 한 하 이 얼 텔레비전, 하 이 얼 냉장고, 하 이 얼 텔레비전 은 텔레비전 제품 등급 구조 에 위치 하고 하 이 얼 냉장 고 는 냉장고 제품 등급 구조 에 있다.시스템 이 제공 하 는 공장 에서 생산 해 야 할 구체 적 인 제품 은 간단 한 대상 이 아니 라 서로 다른 제품 등급 구조 에서 서로 다른 유형의 구체 적 인 제품 에 속 할 때 추상 적 인 공장 모델 을 사용 해 야 한다.
추상 적 인 공장 모델 은 모든 형식의 공장 모델 중에서 가장 추상 적 이 고 일반적인 형태 이다.
추상 적 인 공장 모델 과 공장 방법 모델 의 가장 큰 차이 점 은 공장 방법 모델 은 하나의 제품 등급 구 조 를 대상 으로 하고 추상 적 인 공장 모델 은 여러 개의 제품 등급 구 조 를 직면 해 야 한다. 한 공장 등급 구 조 는 여러 개의 서로 다른 제품 등급 구조 중의 제품 대상 의 설립 을 책임 질 수 있다.한 공장 의 등급 구조 가 서로 다른 제품 등급 구조 에 속 하 는 한 제품 족 중의 모든 대상 을 만 들 수 있 을 때 추상 적 인 공장 모델 은 공장 방법 모델 보다 더욱 간단 하고 효율 적 이다.
추상 적 인 공장 모델 (Abstract Factory Pattern): 일련의 관련 되 거나 서로 의존 하 는 대상 을 만 드 는 인 터 페 이 스 를 제공 합 니 다. 구체 적 인 종 류 를 지정 하지 않 아 도 됩 니 다.추상 적 인 공장 모델 은 Kit 모델 이 라 고도 부 르 며 대상 생 성 모델 에 속한다.
추상 적 인 공장 모델 은 다음 과 같은 역할 을 포함한다.
추상 공장
package creation
type PlantFactory interface {
MakePlant() Plant
MakePicker() Picker
}
type Plant interface {
}
type Picker interface {
}
type PearFactory struct {
}
type Pear struct {
desc string
}
type PearPicker struct {
desc string
}
func (this PearFactory) MakePlant() Plant {
return Pear{" "}
}
func (this PearFactory) MakePicker() Picker {
return PearPicker{" "}
}
client
package main
import (
"gof23/creation"
"fmt"
)
func main() {
factory := creation.PearFactory{}
pearPicker := factory.MakePicker()
pear := factory.MakePlant()
fmt.Println(pear)
fmt.Println(pearPicker)
}
건설 자 모드
건설 자 모드 (Builder Pattern): 복잡 한 대상 의 구축 을 표시 와 분리 시 켜 같은 구축 과정 에서 서로 다른 표 시 를 만 들 수 있 습 니 다.
건설 자 모델 은 한 걸음 한 걸음 복잡 한 대상 을 만 드 는 것 으로 사용자 가 복잡 한 대상 의 유형 과 내용 만 지정 하면 구축 할 수 있 고 사용 자 는 내부 의 구체 적 인 구축 세부 사항 을 알 필요 가 없다.건설 자 모드 는 대상 생 성 모드 에 속 합 니 다.중국어 번역 에 따라 건설 자 모델 은 생 성기 모델 이 라 고도 할 수 있다.
건설 자 모드 는 다음 과 같은 역할 을 포함 합 니 다.
package creation
type Character struct {
Name string
Arms string
}
func (p *Character) SetName(name string) {
p.Name = name
}
func (p *Character) SetArms(arms string) {
p.Arms = arms
}
func (p Character) GetArms() string {
return p.Arms
}
func (p Character) GetName() string {
return p.Name
}
type Builder interface {
SetName(name string) Builder
SetArms(arms string) Builder
Build() *Character
}
type CharacterBuilder struct {
character *Character
}
func (p *CharacterBuilder) SetName(name string) Builder {
if p.character == nil {
p.character = &Character{}
}
p.character.SetName(name)
return p
}
func (p *CharacterBuilder) SetArms(arms string) Builder {
if p.character == nil {
p.character = &Character{}
}
p.character.SetArms(arms)
return p
}
func (p *CharacterBuilder) Build() *Character {
return p.character
}
type Director struct {
Builder Builder
}
func (p Director) Create(name string, arms string) *Character {
return p.Builder.SetName(name).SetArms(arms).Build()
}
client
package main
import (
"fmt"
"gof23/creation"
)
func main() {
var builder creation.Builder = &creation.CharacterBuilder{}
var director *creation.Director = &creation.Director {builder}
var character *creation.Character = director.Create("loader", "AK47")
fmt.Println(character.GetName() + "," + character.GetArms())
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.