Golang单例模式

一、Golang单例模式实现

单例模式是一种常见的设计模式,它保证在整个程序中只会有一个实例对象被创建和使用。在某些情况下,只需要一个对象,例如在配置信息中心。在Golang中,实现单例模式需要考虑Golang的并发特性。

下面是一个常见的经典实现,使用懒惰初始化的方法来确保只会实例化一次实例对象。

type Singleton struct {
}

var instance *Singleton

func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{}
    })
    return instance
}

var once sync.Once

在这个实现中,Golang标准库提供了一个sync.Once类型来确保初始化动作只执行一次。在GetInstance()方法中,我们首先判断实例对象是否已经被创建,如果没有,那么就使用once.Do()方法创建一个实例。

二、Golang工厂模式

Golang工厂模式是一种创建型的设计模式,它定义了一个对象创建的接口,但是让子类决定实例化哪个类。这种方式可以避免暴露对象创建的具体实现逻辑。

下面是一个简单的Golang工厂模式实现,它使用GetAnimal()方法来根据输入的动物名创建对应的动物对象。

type Animal interface {
    Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
    return "Woof!"
}

type Cat struct{}

func (c Cat) Speak() string {
    return "Meow!"
}

func GetAnimal(animalType string) Animal {
    switch animalType {
    case "dog":
        return Dog{}
    case "cat":
        return Cat{}
    default:
        return nil
    }
}

在这个实现中,我们定义了一个Animal接口和两个实现类:Dog和Cat。GetAnimal()方法根据输入的字符串来返回对应的动物对象。

三、Go单例模式

Go单例模式是一种用于解决资源竞争问题的实现方式。如果多个协程同时访问某个变量,会出现资源访问冲突的问题。Go单例模式通过使用channel来限制只有一个协程在任何时刻访问共享资源。

下面是一个简单的Go单例模式实现,其中使用了无缓冲的channel来同步协程之间的访问。

type Singleton struct{}

var once sync.Once
var instance *Singleton
var ch = make(chan int, 1)

func GetInstance() *Singleton {
    if instance == nil {
        ch <- 1
        defer func() { <-ch }()
        once.Do(func() {
            instance = &Singleton{}
        })
    }
    return instance
}

在这个实现中,我们定义了一个无缓冲的channel来控制多个协程之间的访问。在GetInstance()方法中,我们首先将ch的一个元素压入队列中,然后在函数退出时将其出队。这样,可以确保在任何时刻只有一个协程能够访问代码块中的内容。

四、Golang设计模式

设计模式是一种解决软件工程中常见问题的经验总结,它帮助开发者对程序进行架构和设计,提高软件的可维护性、可扩展性和可重用性。Golang支持大多数常见的设计模式。

下面是一些常见的Golang设计模式:

1. 观察者模式

观察者模式定义了对象之间的一种依赖关系,当被观察对象状态发生变化时,所有依赖于它的观察者都将得到通知。在Golang中,可以使用channel来实现观察者模式。

type Observer interface {
    Update(int)
}

type Subject struct {
    observers []Observer
}

func (s *Subject) Attach(o Observer) {
    s.observers = append(s.observers, o)
}

func (s *Subject) Notify(val int) {
    for _, observer := range s.observers {
        observer.Update(val)
    }
}

type ConcreteObserver struct{}

func (c *ConcreteObserver) Update(val int) {
    fmt.Printf("Received update with value %v\n", val)
}

func runObserverPattern() {
    subj := &Subject{observers: []Observer{&ConcreteObserver{}}}
    subj.Notify(10)
}

2. 策略模式

策略模式定义了一系列算法,将每个算法封装为一个单独的类,并让它们可以互换。这种设计模式可以使算法独立于使用它的客户端而变化。

type Strategy interface {
    Execute()
}

type ConcreteStrategy1 struct{}

func (s1 *ConcreteStrategy1) Execute() {
    fmt.Println("Executing Concrete Strategy 1...")
}

type ConcreteStrategy2 struct{}

func (s2 *ConcreteStrategy2) Execute() {
    fmt.Println("Executing Concrete Strategy 2...")
}

type Context struct {
    strategy Strategy
}

func (c *Context) SetStrategy(strategy Strategy) {
    c.strategy = strategy
}

func (c *Context) Execute() {
    c.strategy.Execute()
}

func runStrategyPattern() {
    c := &Context{}
    c.SetStrategy(&ConcreteStrategy1{})
    c.Execute()

    c.SetStrategy(&ConcreteStrategy2{})
    c.Execute()
}

3. 访问者模式

访问者模式是一种行为型模式,它将某些算法封装到类中。在Golang中,访问者模式通常使用函数代替类来实现。

type Element interface {
    Accept(Visitor)
}

type ConcreteElement1 struct{}

func (e1 *ConcreteElement1) Accept(v Visitor) {
    v.VisitConcreteElement1(e1)
}

type ConcreteElement2 struct{}

func (e2 *ConcreteElement2) Accept(v Visitor) {
    v.VisitConcreteElement2(e2)
}

type Visitor interface {
    VisitConcreteElement1(*ConcreteElement1)
    VisitConcreteElement2(*ConcreteElement2)
}

type ConcreteVisitor struct{}

func (c *ConcreteVisitor) VisitConcreteElement1(e1 *ConcreteElement1) {
    fmt.Println("Visiting Concrete Element 1 by Concrete Visitor...")
}

func (c *ConcreteVisitor) VisitConcreteElement2(e2 *ConcreteElement2) {
    fmt.Println("Visiting Concrete Element 2 by Concrete Visitor...")
}

func runVisitorPattern() {
    elements := []Element{&ConcreteElement1{}, &ConcreteElement2{}}
    v := &ConcreteVisitor{}
    for _, el := range elements {
        el.Accept(v)
    }
}

4. ACM模式

ACM(Active Class Middleware)模式是一种以类为中心的分布式体系结构模式。在ACM模式中,运行时环境中有许多对象扮演不同的角色,这些对象在运行过程中相互作用,以实现分布式系统的功能。

在Golang中,可以通过使用GRPC实现ACM模式。

下面是一个简单的GRPC示例:

// server
type GreeterServer struct{}

func (s *GreeterServer) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
    lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 50051))
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &GreeterServer{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

// client
func main() {
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)
    r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "World"})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
}

五、总结

Golang单例模式是一种常见的设计模式,它保证在整个程序中只会有一个实例对象被创建和使用。在Golang中,实现单例模式需要考虑Golang的并发特性。此外,Golang还支持许多其他常见的设计模式,例如工厂模式、观察者模式、策略模式、访问者模式和ACM模式。

原创文章,作者:ZKOL,如若转载,请注明出处:https://www.506064.com/n/138137.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZKOLZKOL
上一篇 2024-10-04 00:18
下一篇 2024-10-04 00:19

相关推荐

  • 使用Golang调用Python

    在现代软件开发中,多种编程语言的协作是相当普遍的。其中一种使用场景是Golang调用Python,这使得在使用Python库的同时,可以利用Golang的高性能和强大并发能力。这篇…

    编程 2025-04-29
  • 使用Golang创建黑色背景图片的方法

    本文将从多个方面介绍使用Golang创建黑色背景图片的方法。 一、安装必要的代码库和工具 在开始创建黑色背景图片之前,我们需要先安装必要的代码库和工具: go get -u git…

    编程 2025-04-29
  • 手机安全模式怎么解除?

    安全模式是一种手机自身的保护模式,它会禁用第三方应用程序并使用仅限基本系统功能。但有时候,安全模式会使你无法使用手机上的一些重要功能。如果你想解除手机安全模式,可以尝试以下方法: …

    编程 2025-04-28
  • Qt State Machine与状态机模式

    本文将介绍Qt State Machine和状态机模式在Qt中的实现。Qt提供了QStateMachine和QState两个类,可以方便地实现状态机模式,并且能有效地处理复杂的、多…

    编程 2025-04-27
  • 显示C++设计模式

    本文将详细介绍显示C++设计模式的概念、类型、优点和代码实现。 一、概念 C++设计模式是在软件设计阶段定义,用于处理常见问题的可重用解决方案。这些解决方案是经过测试和验证的,并已…

    编程 2025-04-27
  • Centos7进入单用户模式的解释

    本文将介绍如何在Centos7中进入单用户模式,并从以下几个方面进行详细的阐述。 一、Centos7进入单用户模式的解答 在Centos7中进入单用户模式需要执行以下步骤: 1. …

    编程 2025-04-27
  • 深入解析PSM模式

    一、PSM模式是什么 PSM模式,即页面-状态-模型模式,是一种前端开发模式。它以页面为中心,将页面内的所有状态和业务逻辑抽象成一个由页面转化而来的虚拟状态机模型,从而将业务逻辑与…

    编程 2025-04-25
  • 授权码模式与OAuth2.0

    一、什么是授权码模式 授权码模式(Authorization Code Grant Type)是OAuth2.0协议中最常用的授权方式之一,也是最为安全的一种授权方式。授权码模式的…

    编程 2025-04-24
  • 谷歌浏览器深色模式

    一、深色模式的概念 深色模式是一种日益流行的 UI 设计趋势,通过使用暗灰色或黑色背景,大大降低了屏幕的亮度,更加舒适和护眼。深色模式也被称为暗黑模式。 谷歌浏览器深色模式的推出可…

    编程 2025-04-24
  • 暗黑模式的盛行

    一、背景和定义 暗黑模式起源于智能手表和夜视仪等专业设备上的配色方案,是指采用黑底白字、暗灰底白字等相对较暗的背景色搭配亮色前景,以减少屏幕对用户眼睛的刺激,降低视觉疲劳感。这种设…

    编程 2025-04-24

发表回复

登录后才能评论