PHP之设计模式(二)---基础篇

本篇博客主要是讲集中基础的设计模式:
1,工厂模式
2,单例模式
3,注册模式

一,工厂模式
我们可以设计出来一个工厂(其实就是类),该工厂的作用就是为我们生产各种对象。这种工厂通常只要指定类名,就可以据此获取

<?php
namespace Shulv;

class Factory{
    //Instance表示“实例”,也就是指“对象”
    static function getInstance($className){//将要实例化的类名传递过来
        if(file_exists('./'.$className.'.class.php')){
            $obj1 = new $className();
            return $obj1;
        }else{
            return 'not exist';
        }
    }
}

二,单例模式
对于某些类,在使用它的时候,从头到尾(从程序的开始到结束),都只需要一个对象,就可以完成所有的人物
* 单例:
* 某个类只允许创建出一个对象,即使去创建多次,也只能得到一个对象(就比如创建一个连接数据库的对象,前前后后只要创建一个就行)

//实现一个单例类:其只能获得一个对象
class B{
    private static $instance;//定义成私有,那么它只能在本类中使用。定义成静态就能通过类名来访问了
    private function __construct(){}//定义成私有,也就是不让别人在类外new 出对象,这样就只能通过getNew()获取对象
    public static function getNew(){
        //如果本类中的$instance还没有数据
        if(!isset(B::$instance)){
            B::$instance = new self;
        }
        return B::$instance;
    }
    private function __clone() {

    }
}
$o1 = B::getNew();
$o2 = B::getNew();
//我们会发现这创建的还是一个类(资源标识符相同)
//var_dump($o1,$o2);
//下面我们再看一下一个特殊情况
$o3 = clone $o1;//克隆对象(当我把那个__clone()方法定义成私有,这句就会报错)
var_dump($o1,$o2,$o3);//这个时候我们会发现$o3是一个新对象了 这个时候又不符合单例了(注意:这个clone算运算符)
/* *本来一个类中有一个隐藏的public function __clone()方法,那我们如果想实现单例,我们给它定义成私有就行,不让他在类外使用 */

三,注册模式
全局共享和交换对象

<?php

namespace Shulv;
/* 注册模式就是用来将一些对象注册到我们的全局事物上边,那就可以在任意位置访问 */
class Register{
    protected static $objects; 
    function set($alias, $object){//表示将一个对象注册到全局的注册树上
        self::$objects[$alias] = $object;//第一个参数表示取的别名
    }
    function _unset($alias){//注意:这个_unset()不是魔术方法,魔术方法那个是__unset()(两个下划线)
        //表示从树上移除
        unset(self::$objects[$alias]);
    }
    function get($name){
        return self::$objects[$alias];
    }
}

//当我们在工厂模式中获得对象之后,再将获得的对象映射到全局树上,那么工厂模式就只用构造一次

Register::set('A',$a);//A是别名(加在工厂模式中)
    原文作者:书旅LY
    原文地址: https://blog.csdn.net/self_realian/article/details/78249287
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞