2025-04-14

单例

单例很简单就是一个类一个类只初始化一次

 

定义一个单例类

class Single {
  protected static $instance = NULL;

  public static function getInstance():static {
    if (self::$instance == NULL) {
      self::$instance = new static;
    }
    return self::$instance;
  }
}

 

继承和使用

class DB extends Single {
}

class Logger extends Single {

}

$db = DB::getInstance();
$logger = Logger::getInstance();

 

多例

如果我们需要的不仅仅是一个记录器实例,因为有些消息必须写入文件中,有些消息需要通过电子邮件发送

定义多例

class Multiple {
  protected static array $instance = [];

  public static function getInstance($key) {
    if (!isset(self::$instance[$key])) {
      self::$instance[$key] = new static;
    }
    return self::$instance[$key];
  }
}

 

// 定义写入日志的接口
interface LoggerHanderInterface {
  public function save($level, $message, $context);
}

 

定义3种写入日志的方式

class DbLogger implements LoggerHanderInterface {
  public function save($level, $message, $context) {
    print ("Save to db $level: $message");
  }
}

class FileLogger implements LoggerHanderInterface {
  public function save($level, $message, $context) {
    print ("Save File$level: $message");
  }
}

class MailLogger implements LoggerHanderInterface {
  public function save($level, $message, $context) {
    print ("Send mail $level: $message");
  }
}

 

最后定义logger. 这里使用了psr\Log这个包.

class Logger extends Multiple implements \Psr\Log\LoggerInterface {
  use \Psr\Log\LoggerTrait;

  private LoggerHanderInterface $handle;

  public function setHandle(LoggerHanderInterface $hander) {
    $this->handle = $hander;
  }

  public function log($level, $message, array $context = array())
  {
    $this->handle->save($level, $message, $context);
  }
}

 

测试

$db_logger = Logger::getInstance('db');
$db_logger->setHandle(new DbLogger());

$file_logger = Logger::getInstance('file');
$file_logger->setHandle(new FileLogger());

$mail_logger = Logger::getInstance('mail');
$mail_logger->setHandle(new MailLogger());


// 打印hander 是 DbLogger
$logger1 = Logger::getInstance('db');
var_dump($logger1);

// 打印hander 是 DbLogger
$logger2 = Logger::getInstance('db');
var_dump($logger2);

// 打印hander 是 MailLogger
$logger3 = Logger::getInstance('mail');
var_dump($logger3);

 

标签: 设计模式