Junior
Кайсы дизайн үлгүлөрү менен таанышсыз?
sobes.tech AI
AIден жооп
Мен Go'до колдонулган ар кандай дизайн үлгүлөрү менен таанышмын. Алардын эң кеңири тарагандарынын айрымдары:
Жасоо үлгүлөрү:
- Singleton: Бир гана класс үлгүсүнүн бар экенин камсыз кылат жана ага глобалдуу кирүү чекитин берет. Go'до ал көбүнчө
sync.Onceаркылуу ишке ашырылат.package main import ( "sync" ) type singleton struct{} var instance *singleton var once sync.Once func GetInstance() *singleton { once.Do(func() { instance = &singleton{} }) return instance } - Фабрика ыкмасы: объект түзүү үчүн интерфейс белгилейт, бирок подклассылар кайсы классты инстанцалоо керек экенин чечет. Go'до ал көбүнчө функциялар аркылуу ишке ашырылат, алар интерфейсти кайтарат.
package main type Product interface { Operate() } type ConcreteProductA struct{} func (p *ConcreteProductA) Operate() { // Операцияны ишке ашыруу } type ConcreteProductB struct{} func (p *ConcreteProductB) Operate() { // Операцияны ишке ашыруу } func NewProduct(productType string) Product { switch productType { case "A": return &ConcreteProductA{} case "B": return &ConcreteProductB{} default: return nil // же ката } } - Анык фабрика: байланыштуу же көзкарандуу объекттердин үй-бүлөлөрүн түзүү үчүн интерфейс камсыз кылат.
- Builder: к复杂 объекттин куруу процесси анын көрсөтмөсүнөн бөлүнөт.
Структуралык үлгүлөр:
- Adapter: Бир класстын интерфейсин башка класска айлантат, кардарлар талап кылгандай. Класстарды бирге иштешүүгө мүмкүндүк берет, башкача айтканда, шайкеш келбеген.
- Decorator: Объектке динамикалуу жаңы милдеттер кошот. Decorator'лор функционалдуулукту кеңейтүү үчүн мураска салыштырмалуу ийкемдүү альтернатива сунуштайт.
- Facade: Подсистемадагы интерфейстердин топтомуна бириккен интерфейс камсыз кылат. Жогорку деңгээлдеги интерфейс аны колдонууңузду жеңилдетет.
- Proxy: Башка объекттин ордуна же ортоңкусы болуп, ага кирүүнү башкаруу үчүн кызмат кылат.
Аралаш үлгүлөр:
- Observer: Объекттердин ортосунда "бирден көпкө" көзкарандылык аныктайт. Бир объекттин абалы өзгөргөндө, анын бардык көзкарандылары кабардар болуп, автоматтык түрдө жаңыртылат.
- Strategy: Алгоритмдердин үй-бүлөсүн аныктайт, ар бирин капсуладайт жана алмаштырылуучу кылат. Алгоритмдердин өзгөрүшүнө кардарлардан көз карандысыз мүмкүнчүлүк берет.
package main type Strategy interface { Execute(data string) } type ConcreteStrategyA struct{} func (s *ConcreteStrategyA) Execute(data string) { // Стратегия Aны ишке ашыруу } type ConcreteStrategyB struct{} func (s *ConcreteStrategyB) Execute(data string) { // Стратегия Bны ишке ашыруу } type Context struct { strategy Strategy } func (c *Context) SetStrategy(strategy Strategy) { c.strategy = strategy } func (c *Context) ExecuteStrategy(data string) { c.strategy.Execute(data) } - Шаблондуу ыкма: Алгоритмдин каркасын аныктайт, айрым кадамдарды подклассларга өткөрүп берет. Подклассларга алгоритмдин белгилүү кадамдарын кайра аныктоого мүмкүндүк берет, анын түзүмүн өзгөртпөстөн.
Мындан тышкары, мен Command, Chain of Responsibility, Iterator, Mediator, Memento, State, Visitor үлгүлөрү менен да таанышмын. Go'до ошондой эле тилге өзгөчө идиомалар кеңири колдонулат, мисалы, интерфейстерди колдонуу абстракция үчүн, горутиндер жана каналдар параллелизм үчүн.