zoukankan      html  css  js  c++  java
  • Singleton(单例模式)

    Singleton(单例模式)

      单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建一个可访问的实例。

    <?php
    /**
     * Singleton class
     */
    final class Product
    {
     
        /**
         * @var self
         */
        private static $instance;
     
        /**
         * @var mixed
         */
        public $mix;
     
     
        /**
         * Return self instance
         *
         * @return self
         */
        public static function getInstance() {
            if (!(self::$instance instanceof self)) {
                self::$instance = new self();
            }
            return self::$instance;
        }
     
        private function __construct() {
        }
     
        private function __clone() {
        }
    }
     
    $firstProduct = Product::getInstance();
    $secondProduct = Product::getInstance();
     
    $firstProduct->mix = 'test';
    $secondProduct->mix = 'example';
     
    print_r($firstProduct->mix);
    // example
    print_r($secondProduct->mix);
    

      在很多情况下,需要为系统中的多个类创建单例的构造方式,这样,可以建立一个通用的抽象父工厂方法:

    <?php
     
    abstract class FactoryAbstract {
     
        protected static $instances = array();
     
        public static function getInstance() {
            $className = static::getClassName();
            if (!(self::$instances[$className] instanceof $className)) {
                self::$instances[$className] = new $className();
            }
            return self::$instances[$className];
        }
     
        public static function removeInstance() {
            $className = static::getClassName();
            if (array_key_exists($className, self::$instances)) {
                unset(self::$instances[$className]);
            }
        }
     
        final protected static function getClassName() {
            return get_called_class();
        }
     
        protected function __construct() { }
     
        final protected function __clone() { }
    }
     
    abstract class Factory extends FactoryAbstract {
     
        final public static function getInstance() {
            return parent::getInstance();
        }
     
        final public static function removeInstance() {
            parent::removeInstance();
        }
    }
    // using:
     
    class FirstProduct extends Factory {
        public $a = [];
    }
    class SecondProduct extends FirstProduct {
    }
     
    FirstProduct::getInstance()->a[] = 1;
    SecondProduct::getInstance()->a[] = 2;
    FirstProduct::getInstance()->a[] = 3;
    SecondProduct::getInstance()->a[] = 4;
     
    print_r(FirstProduct::getInstance()->a);
    // array(1, 3)
    print_r(SecondProduct::getInstance()->a);
    // array(2, 4)
    

      

  • 相关阅读:
    mac 配置环境变量
    c语言中的0UL或1UL是什么意思
    javascript类型系统——正则表达式RegExp类型
    javascript运算符——算术运算符
    javascript类型系统——Number数字类型
    javascript类型系统——包装对象
    javascript基础语法——表达式
    valueOf()方法
    toString()方法
    javascript基础语法——变量和标识符
  • 原文地址:https://www.cnblogs.com/Czc963239044/p/7115696.html
Copyright © 2011-2022 走看看