在 Go 和 PHP 中实现 单例模式 的核心目标是:确保一个类(或结构体)在整个程序运行期间只有一个实例,并提供一个全局访问点。

✅ 1.Go 语言实现单例模式

Go 是一种静态类型语言,没有传统意义上的“类”,但可以通过结构体和方法实现类似功能。Go 的并发模型非常强大,因此实现单例时要特别注意并发安全

package singleton

import (
    "sync"
)

// Singleton 单例结构体
type Singleton struct {
    data string
}

// instance 是 Singleton 的唯一实例
var instance *Singleton
var once sync.Once

// GetInstance 获取单例实例
func GetInstance() *Singleton {
    once.Do(func() {
        instance = &Singleton{
            data: "Singleton Data",
        }
    })
    return instance
}

🔍 实现说明:

  • once.Do() 是 Go 标准库 sync 包提供的机制,保证初始化函数只执行一次,即使多个 goroutine 同时调用 GetInstance()
  • 使用 sync.Once 是实现并发安全单例的最佳实践。
  • data 字段可以扩展为实际需要共享的资源(如数据库连接池、配置信息等)。

✅ 2.PHP 实现单例模式

PHP 是一种脚本语言,通常每个 HTTP 请求都会重新初始化一次环境,因此单例在请求生命周期内有效。PHP 中使用类和静态方法可以轻松实现单例。

<?php

class Singleton {
    // 静态属性保存唯一实例
    private static $instance;

    // 私有构造函数,防止外部实例化
    private function __construct() {
        $this->data = "Singleton Data";
    }

    // 克隆方法设为私有,防止克隆
    private function __clone() {}

    // 反序列化方法设为私有,防止反序列化
    private function __wakeup() {}

    // 静态方法获取实例
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getData() {
        return $this->data;
    }
}

🔍 实现说明:

  • 私有构造函数:防止外部通过 new Singleton() 创建实例。
  • 私有克隆方法:防止通过 clone 创建新实例。
  • 私有 __wakeup 方法:防止反序列化创建新实例。
  • 静态方法 getInstance():提供全局访问点,确保返回的是同一个实例。

🧪 3.示例用法

Go 示例:

package main

import (
    "fmt"
    "yourproject/singleton"
)

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

    fmt.Println(s1 == s2) // 输出: true
    fmt.Println(s1.data)  // 输出: Singleton Data
}

PHP 示例:

<?php

$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();

var_dump($instance1 === $instance2); // 输出: bool(true)
echo $instance1->getData();          // 输出: Singleton Data

⚠️ 4.注意事项

语言 重点注意事项
Go 使用 sync.Once 保证并发安全,避免多个 goroutine 同时初始化
PHP 单例只在当前请求生命周期内有效,不同请求之间不会共享实例

✅ 5.应用场景

  • Go:适用于高性能、并发环境,如数据库连接池、日志系统、配置管理。
  • PHP:适用于 Web 应用中,如数据库连接、缓存客户端、全局配置对象等。

通过上述实现,你可以确保在 Go 或 PHP 中安全地使用单例模式,合理控制资源的访问与使用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐