第2节 单一职责原则


❤️💕💕Java和Golang的设计模式,设计模式介绍、创建者模式、结构型模式、行为型模式。Myblog:http://nsddd.topopen in new window


[TOC]

什么是单一职责原则

单一职责原则

类的职责单一,对外只提供一种功能,二引起类变化的原因都只有一个

Go语言中通常如何实现单例模式

在Go语言中,可以使用懒汉式或饿汉式来实现单例模式。

懒汉式

在懒汉式中,实例对象不会在程序初始化时被创建,而是在第一次调用该实例对象时才会被创建。这种方式可以避免不必要的资源浪费。下面是一个使用懒汉式实现单例模式的示例代码:

package main

import (
	"fmt"
	"sync"
)

type singleton struct{}

var instance *singleton
var once sync.Once

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

func main() {
	s1 := GetInstance()
	s2 := GetInstance()

	fmt.Println(s1, s2)

	// if s1 == s2
	if s1 == s2 {
		fmt.Println("s1 == s2") // yes
	} else {
		fmt.Println("s1 != s2")
	}
}

在上述实现中,once对象保证了GetInstance()函数只会被执行一次。第一次调用GetInstance()函数时,once.Do()方法会执行传递给它的匿名函数,该匿名函数会创建一个新的singleton对象,并将它赋值给instance变量。之后再次调用GetInstance()函数时,就会直接返回已经创建好的instance变量。

饿汉式

在饿汉式中,实例对象在程序初始化时就会被创建。这种方式可以保证在任何时候都能够获得该实例对象,但是可能会造成不必要的资源浪费。下面是一个使用饿汉式实现单例模式的示例代码:

package singleton

type singleton struct {}

var instance *singleton = &singleton{}

func GetInstance() *singleton {
    return instance
}

代码

💡简单的一个案例如下:

/*
 * @Description: 单一职责原则
 * @Author: xiongxinwei 3293172751nss@gmail.com
 * @Date: 2022-10-26 20:08:39
 * @LastEditTime: 2022-10-26 20:15:04
 * @FilePath: \code\设计模式\设计模式第1节.go
 * @Github_Address: https://github.com/cubxxw/awesome-cs-cloudnative-blockchain
 * Copyright (c) 2022 by xiongxinwei 3293172751nss@gmail.com, All Rights Reserved. @blog: http://nsddd.top
 */
package main

import "fmt"

type Person struct {
	Name string
}

func (p *Person) Eat() {
}

func (p *Person) Sleep() {
}

func (p *Person) Work() {
}

func (p *Person) Drive() {
}

// Path: 设计模式\设计模式第1节.go
//上面的代码可以设计成单一职责原则

type User struct {
	Name string
}

type Password struct {
	Password string
}

func (p *User) GetInfo() {
	fmt.Println("获取用户信息")
}

func (p *Password) GetInfo() {
	fmt.Println("获取密码信息")
}

func main() {
	p := &Person{}
	p.Eat()
	p.Sleep()
	p.Work()
	p.Drive()

	//单一职责原则
	u := &User{}
	u.GetInfo()
	pwd := &Password{}
	pwd.GetInfo()
}

🚀 编译结果如下:

[Running] go run "d:\文档\最近的\awesome-golang\docs\go-advancend\code\设计模式\设计模式第1节.go"
获取用户信息
获取密码信息

END 链接