zoukankan      html  css  js  c++  java
  • 基础设计模式:单例模式+工厂模式+注册树模式

    单例模式:

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

    使用场景:

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

    实现:

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

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

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

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

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

    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");
  • 相关阅读:
    复习HTML/CSS 3
    复习HTML/CSS2
    复习HTML/CSS1
    HTML/CSS8
    HTML/CSS7
    HTML/CSS6
    9.5Html
    9.4Html
    面向对象
    作用域以及类、实例
  • 原文地址:https://www.cnblogs.com/leezhxing/p/3647369.html
Copyright © 2011-2022 走看看