php实现三种基本的设计模式--单例,工厂,注册

单例模式:确保创建的是唯一的实例

核心思想就是不能通过在类外new新建一个实例,通过instance,来创建实例,在创建时先判断是否存在,如果存在则返回当前实例,不存在即返回一个新建的实例,我们看一下php的实现

代码:

<?php
class test{
    private static $instance;
    private function __construct()
    {

    }
    public static function get_instance(){
        if(self::$instance==null){
            self::$instance=new test();
        }
        return self::$instance;
    }
}
$a=test::get_instance();
$b=test::get_instance();
if($a==$b){
    echo "这是一个对象哦";
}
C:\wamp64\bin\php\php7.0.10\php.exe C:\wamp64\www\api\test.php
这是一个对象哦
Process finished with exit code 0

需要注意的几点:构造函数必须是私有的,才能保证不能类外new一个实例,有一个静态私有变量储存实例,每次创建的时候就判断它是否为空就知道是否已经创建了,所以上面创建两次,其实是一个,这就是单例模式。

工厂模式:

工厂模式有一个关键的构造,根据一般原则命名为Factory的静态方法,然而这只是一种原则,虽然工厂方法可以任意命名这个静态还可以接受任意数据的参数,必须返回一个对象。

大概我的理解就是所需要的实例都可以通过工厂进行创造,我们给工厂我们想要的对象名,他给我返回一个实体,然后我们就可以正常使用。我们通过代码理解一下
代码:

<?php
class test{
    private static $instance;
    private function __construct()
    {

    }
    public static function get_instance(){
        if(self::$instance==null){
            self::$instance=new test();
        }
        return self::$instance;
    }
}
class Factor{

    public static function createoj($classname){
        $oj=$classname::get_instance();
        return $oj;
    }
}

$a=Factor::createoj('test');
var_dump($a);
C:\wamp64\bin\php\php7.0.10\php.exe C:\wamp64\www\api\test.php
object(test)#1 (0) {
}

Process finished with exit code 0

这是简单的实现,结合上个单例模式,定义了工厂类后,把要的对象传给他,让他去创建实例,并返回给我们。

注册树模式

把所有注册过的对象都存储起来,有用的时候直接通过get方法拿一个出来

代码:

<?php
class test{
    private static $instance;
    public $a=1;
    private function __construct()
    {

    }
    public static function get_instance(){
        if(self::$instance==null){
            self::$instance=new test();
        }
        return self::$instance;
    }
}
class Factory{

    public static function createoj($classname){
        $oj=$classname::get_instance();
        return $oj;
    }
}
class Register{
    protected static $objects;
    public static function set($alias,$object){
        self::$objects[$alias]=$object;
    }
    public static function get($alias){
        return self::$objects[$alias];
    }
    public static function _unset($alias){
        unset(self::$objects[$alias]);
    }
}

Register::set('rand',Factory::createoj('test'));

$object=Register::get('rand');

print_r($object);
C:\wamp64\bin\php\php7.0.10\php.exe C:\wamp64\www\api\test.php
test Object
(
    [a] => 1
)

Process finished with exit code 0

我特意加了一个public变量,让大家理解的更明白一些,其中rand就是储存在注册树中的键名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值