博客列表 >php常用设计模式(单例,工厂,注册树模式)

php常用设计模式(单例,工厂,注册树模式)

forever浅笑
forever浅笑原创
2018年05月16日 10:58:15965浏览

单例模式

实例

<?php

/医院
 * 单例模式
 */
class Single
{
    private static $instance = null;

    // 不允许实例化
    private function __construct() { }

    // 不允许克隆
    private function __clone() { }

    // 获取对象
    public static function getInstance()
    {
        if (self::$instance == null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    // 从1加到100
    public function total() {
        $s = 0;
        for ($i = 1; $i <= 100; $i++) {
            $s = $s + $i;
        }
        echo $s;
    }
}

$obj1 = Single::getInstance();
var_dump($obj1);  // object(Single)#1 (0) { }
$obj2 = Single::getInstance();
var_dump($obj2); // object(Single)#1 (0) { }
echo '<hr>';
$obj1->total();

// 单例模式总结
// 1. 创建一个null的静态实例
// 2. 不允许实例化,不允许克隆
// 3. 创建一个静态方法判断并获取返回对象

运行实例 »

点击 "运行实例" 按钮查看在线实例


简单工厂模式 


实例

<?php

/医院
 *  简单工厂模式
 */
class ProductFactory
{
    public static function create($type)
    {
        switch ($type) {
            case 'A':
                return new ProductA();
                break;
            case 'B':
                return new ProductB();
                break;
        }
    }
}

class ProductA {
    public function __construct()
    {
        echo 'this is productA';
    }
}

class ProductB {
    public function __construct()
    {
        echo 'this is productB';
    }
}

ProductFactory::create('A');  // this is productA
echo '<hr>';
ProductFactory::create('B'); // this is productB

// 总结:
    //工厂模式与单例模式只产生单一实例不同,工厂模式用于创建多种类型的多个实例对象

运行实例 »

点击 "运行实例" 按钮查看在线实例

注册树模式 / 对象池模式


实例

<?php

/医院
 *  注册树模式 / 对象池模式
 */
class Demo1
{
    public function show()
    {
        echo 'this is demo1';
    }
}

class Demo2
{
    public function show()
    {
        echo 'this is demo2';
    }
}

class Demo3
{
    public function show()
    {
        echo 'this is demo3';
    }
}

class Tree
{
    private static $obj = [];

    // 将对象挂载到注册树上
    public static function set($key, $val)
    {
        self::$obj[$key] = $val;
    }

    // 将对象从注册树上取出来
    public static function get($key)
    {
        return self::$obj[$key];
    }

    // 将对象从注册树上删除
    public static function del($index)
    {
        unset(self::$obj[$index]);
    }
}

Tree::set('demo1',new Demo1());
Tree::set('demo2',new Demo2());
Tree::set('demo3',new Demo3());
echo '<hr>';
$obj1 = Tree::get('demo1');
$obj1->show(); // this is demo1
echo '<hr>';
$obj2 = Tree::get('demo2');
$obj2->show(); // this is demo2
echo '<hr>';
$obj3 = Tree::get('demo3');
$obj3->show(); // this is demo3

// 总结:  注册树模式就是直接用数组来存储对象

运行实例 »

点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议