当多个对象共用同一个实例时,就是使用单例模式的场景。在PHP中,我们可以使用静态变量或全局变量来实现单例模式。
实现单例模式的两种方法
1. 饿汉式(线程安全)
饿汉式单例是指在类加载时就创建一个单例对象,并且单例对象是final类型,在使用时已经创建好了,不需要检查是否为空,可以提高性能。但是如果单例类的构造函数中含有很多耗时的操作,会导致程序启动变慢。
class Singleton
{
private static $instance = new Singleton();
private function __construct(){}
public static function getInstance()
{
return self::$instance;
}
}
2. 懒汉式(线程不安全)
懒汉式单例是指在多线程环境下使用,只有在使用时才创建对象,可以节省资源。但是由于没有线程锁,可能会导致多个线程同时创建实例,出现线程安全问题。
class Singleton
{
private static $instance;
private function __construct(){}
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new Singleton();
}
return self::$instance;
}
}
示例说明
示例一:Connection类
class Connection
{
private static $instance;
private function __construct() {}
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new Connection();
}
return self::$instance;
}
public function connect()
{
echo "Connected!\n";
}
}
// 使用示例
$connection = Connection::getInstance();
$connection->connect(); // 输出:Connected!
在数据库操作中,一个连接只需要一个实例,使用单例模式可以确保只有一个实例被创建。
示例二:Config类
class Config
{
private static $instance;
private $configs = [];
private function __construct() {}
public static function getInstance()
{
if (self::$instance == null) {
self::$instance = new Config();
}
return self::$instance;
}
public function set($key, $value)
{
$this->configs[$key] = $value;
}
public function get($key)
{
return $this->configs[$key];
}
}
// 使用示例
$config = Config::getInstance();
$config->set("name", "John");
$name = $config->get("name");
echo $name; // 输出:John
在一些设置中,一个配置只需要一个实例,使用单例模式可以确保只有一个实例被创建。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php实现设计模式中的单例模式详解 - Python技术站