96.2 设计模式,php代码实现

设计模式:
工厂模式,使对象有一个统一生成(实例化)的入口。
简单工厂,也称静态工厂的例子:

// Factory
class Factory
{
    public static function createProduct(string $type) : Product
{
        $product = null;
        switch ($type) {
            case 'A':
                $product = new ProductA();
                break;
            case 'B':
                $product = new ProductB();
                break;
        }
        return $product;
    }
}

产品接口和产品实现

// Products
interface Product
{
    public function show();
}

class ProductA implements Product
{
    public function show()
{
        echo 'Show ProductA';
    }
}

class ProductB implements Product
{
    public function show()
{
        echo 'Show ProductB';
    }
}

//客户端调用
$productA = Factory::createProduct('A');
$productB = Factory::createProduct('B');
$productA->show();
$productB->show();

工厂模式的主要优势在于,如果你不使用的话,那么你以后代码维护的时候,一旦你的原始类修改,那么每个类的名字都会被修改。但是你使用工厂模式后,只需要修改工厂模式的switch 中的一个就可以。
单例模式:
节省资源,只能够创建一个实例。四个私有,一个共有。

class Singleton{
    //私有属性,用于保存实例
    private static $instance;
    //构造方法私有化,防止外部创建实例
    private function __construct(){}
    //公有属性,用于测试
    public $a;
    //公有方法,用于获取实例
    public static function getInstance(){
        //判断实例有无创建,没有的话创建实例并返回,有的话直接返回
        if(!(self::$instance instanceof self)){
            self::$instance = new self();
        }
        return self::$instance;
    }
    //克隆方法私有化,防止复制实例
    private function __clone(){}
}

发布订阅模式

<?php
    //定义Observer接口
    interface Observer 
    {
        function notify($msg);
    }

    //User用户实现Observer接口
    class User implements Observer {
        public $name;

        public function __construct($name) {
            $this->$name = $name;
            Msg::getInstance()->register($this);
        }

        public function notify($msg) {
            echo $this->name . ' '. 'recive msg' .$msg.'\r\n';
        }
    }

    class Msg 
    {
        private $obeservers = [];
        private static $_instance ;

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

        public function publish($msg) {
            foreach ($this->observers as $observer) {
                $observer->notify($msg);
            }
        }

        function register(Observer $o) {
            $this->observers[] = $o;

        }
    }

$user1 = new User('xushengbin');
$user2 = new User('zhuqiaozhen');
$msg = Msg::getInstance()->publish('今天要下雨了');

参考文献:
[1] PHP设计模式之简单工厂模式 ZyBlog 硬核项目经理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值