一、单例模式
<?php
class Singleton {
private static $_instance = null;
// 构造方法私有化
private function __construct() {}
// 提供一个public方法供外部调用,以获取实例对象
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
// 防止克隆实例
public function __clone() {
exit('Clone is not allowed:' . E_USER_ERROR);
}
// 防止通过序列化/反序列化的方式创建新实例
public function __sleep() {
exit('Serialize is not allowed');
}
}
?>
二、简单工厂/静态工厂模式
注:这两种不属于23种设计模式
<?php
class Button {/* ...*/}
class WinButton extends Button {/* ...*/}
class MacButton extends Button {/* ...*/}
interface ButtonFactory {
public function createButton($type);
}
class MyButtonFactory implements ButtonFactory {
// 实现工厂方法
// 将这个方法改为静态方法,就由「简单工厂模式」变成了「静态工厂模式」
public function createButton($type) {
switch($type) {
case 'Mac':
return new MacButton();
case 'Win':
return new WinButton();
}
}
}
?>
三、工厂模式
<?php
class Button {}
class MacButton extends Button {}
class WinButton extends Button {}
interface AbstractFactory {
public function createButton();
}
class MacFactory implements AbstractFactory {
public function createButton() {
return new MacButton();
}
class WinFactory implements AbstractFactory {
public function createButton() {
return new WinButton();
}
}
?>
四、抽象工厂模式
<?php
class Button {}
class Border {}
class MacButton extends Button {}
class WinButton extends Button {}
class MacBorder extends Border {}
class WinBorder extends Border {}
interface AbstractFactory {
public function createButton();
public function createBorder();
}
class MacFactory implements AbstractFactory {
public function createButton() {
return new MacButton();
}
public function createBorder() {
return new MacBorder();
}
}
class WinFactory implements AbstractFactory {
public function createButton() {
return new WinButton();
}
public function createBorder() {
return new WinBorder();
}
}
?>
五、观察者模式
ProducerA
类负责生产消息
ConsumerA
和ConsumerB
负责消费消息
<?php
class Message
{
public $senderName; // 消息发送者名称
public $payload; // 消息内容
}
interface IConsumer
{
public function onReceive(Message $msg);
}
abstract class AbstractProducer
{
/**
* 消息生产者名字
*
* @var string
*/
private $name;
/**
* 消息消费者数组
*
* @var IConsumer[]
*/
private $consumerList = [];
public function __construct(string $name)
{
$this->name = $name;
}
/**
* 添加消费者
*
* @param IConsumer $consumer
*
* @return void
*/
public function add(IConsumer $consumer)
{
$this->consumerList[] = $consumer;
}
/**
* 生产消息
*
* @param string $msg
*
* @return void
*/
public function produce(string $msg)
{
$msgObj = new Message();
$msgObj->senderName = $this->name;
$msgObj->payload = $msg;
foreach ($this->consumerList as $consumer) {
$consumer->onReceive($msgObj);
}
}
}
class ConsumerA implements IConsumer
{
public function onReceive(Message $msg)
{
echo "ConsumerA receive message: " . json_encode($msg) . "\n";
}
}
class ConsumerB implements IConsumer
{
public function onReceive(Message $msg)
{
echo "ConsumerB receive message: " . json_encode($msg) . "\n";
}
}
class ProducerA extends AbstractProducer
{
public function __construct()
{
parent::__construct('ProducerA');
}
}
$producerA = new ProducerA();
$producerA->add(new ConsumerA());
$producerA->add(new ConsumerB());
$producerA->produce('Hello World');