PHP各种设计模式代码示例

一、单例模式

<?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类负责生产消息
ConsumerAConsumerB负责消费消息

<?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');
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值