基础设计模式:单例模式+工厂模式+注册树模式

单例模式:

通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次。

使用场景:

一般数据库实例都会用单例模式

实现:

单例设计模式就是要一个类只能实例化一个对象。

要想让一个类只能实例化一个对象,就要让类先不能实例化对象,就是构造方法私有。

现在,要想实例化该类必须通过访问静态方法来实例化改类

为了防止实例多次,需要通过一个成员变量来控制加以判断

因为静态方法不能访问非静态成员,所以声明的成员也要是静态的,同时防止外部访问该成员,还要私有

class Singleton{
    
    private static $_instance;  //声明一个私有的,静态的成员属性$instance;
    
    private function __construct(){}  //构造方法私有,防止new实例化。
    
    public static function getInstance(){     //只能通过静态方法实例化对象
            if( !( self::$_instance instanceof Singleton ) )
                self::$_instance = new self();
                
            return self::$obj;
    }
    
private function __clone(){} //防止clone对象
  
private function __wakeup(){} //防止使用序列化。

   function query($sql){ echo $sql; } }
/*通过静态方法实例化*/ $db = Singleton::getInstance(); //访问对象中的成员 $db->query("select * from user");

 工厂模式:

工厂类就是一个专门用来创建其它对象的类。所有地方加载类都走工厂方法。

注册树模式:

小工程并不实用,对于大工程方便管理生成对象。

三个模式的结合使用:

一个数据库的单例模式,通过工厂方法调用,生成的对象注册到注册树中。

<?php

/**
 * 单例模式
 */
trait Singleton
{
    private static $_instance;

    private function __construct()
    {
    }

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

        return self::$_instance;
    }

    final private function __clone()
    {
    }
}

/**
 * 数据库类,通过trait使用单例模式
 */
class Database{
    use Singleton;

    public function query($sql)
    {
        //return ret...
    }
}

/**
 * 工厂方法,生成对象
 */
class Loader
{
    /**
     * 创建对象方法,创建成功加入注册树
     * @param $cls
     * @return null|static
     */
    public static function loadObject($cls)
    {
        $obj = ObjectFinder::find($cls);
        if (!is_object($obj)) {
            $obj = $cls::getInstance();
            ObjectFinder::register($cls, $obj);
        }

        return $obj;
    }
}

/**
 * 注册树类,存取工厂创建好的对象
 */
class ObjectFinder
{
    protected static $_object;

    /**
     * 获取类对应的对象
     * @param $cls
     * @return null
     */
    public static function find($cls)
    {
        if (isset(self::$_object[$cls])) {
            return self::$_object[$cls];
        }
        return null;
    }

    /**
     * 注册对象
     * @param $cls
     * @param $obj
     * @return bool
     */
    public static function register($cls, $obj)
    {
        if (!is_object($obj) || isset(self::$_object[$cls])) {
            return false;
        }

        self::$_object[$cls] = $obj;
        return true;
    }

    /**
     * 销毁对象
     * @param $cls
     */
    public static function destory($cls)
    {
        if (self::find($cls)) {
            unset(self::$_object[$cls]);
        }
    }
}

//创建一个
$db = Loader::loadObject("Database");
原文地址:https://www.cnblogs.com/leezhxing/p/3647369.html