zoukankan      html  css  js  c++  java
  • PHP 设计模式

    PHP 设计模式

    1、单例模式

    2、工厂模式

    3、注册模式

    4、适配器模式

    5、策略模式

    6、观察者模式

    7、原型模式

    8、装饰器模式

      

    1、单例模式

    单例模式,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

    单例模式的要点有三个:

    1. 类只能有一个实例;

    2. 它必须自行创建这个实例;

    3. 它必须自行向整个系统提供这个实例;

    为什么要使用PHP单例模式:

    1. PHP的应用主要在于数据库应用, 一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的 NEW 操作消耗的资源,还可以减少数据库连接这样就不容易出现多链接的情况。

    2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现。

    3. 在一次页面请求中, 便于进行调试, 因为所有的代码 (例如数据库操作类db) 都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处 var_dump, echo。

    单例模式例子

    <?php 
    /**
      * 设计模式之单例模式
      * $_instance必须声明为静态的私有变量
      * 构造函数必须声明为私有,防止外部程序 new 类从而失去单例模式的意义
      * get_instance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
      * ::操作符, 只能访问静态变量和静态函数
      * new 对象都会消耗内存
      * 使用场景:最常用的地方是数据库连接。
      * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
      */
    class man
    {
         //保存例实例在此属性中
         private static $_instance;
    
         //构造函数声明为private,防止直接创建对象
         private function __construct()
         {
             echo '我被实例化了!';
         }
    
         //单例方法
        public static function get_instance()
        {
            //打印输出
            var_dump(isset(self::$_instance));
    
            //于检测变量是否已设置并且非 NULL
            if(!isset(self::$_instance))
            {
                self::$_instance = new self();
            }
             return self::$_instance;
         }
    
         //阻止用户复制对象实例
         private function __clone()
         {
             trigger_error('Clone is not allow' ,E_USER_ERROR);
         }
    
         function test()
         {
             echo "</br>";
             echo("测试");
        }
     }
    
     // 这个写法会出错,因为构造方法被声明为private
     //$test = new man;
    
     // 下面将得到Example类的单例对象
     $test = man::get_instance();
    $test = man::get_instance();//不会再次创建 $test->test(); // 复制对象将导致一个 E_USER_ERROR. //Call to private man::__clone() from context //$test_clone = clone $test; ?>

    单例模式,使某个类的对象仅允许创建一个。构造函数 private 修饰, 
    申明一个static get_instance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。

    结果显示:

  • 相关阅读:
    2019总结及2020计划
    蓝牙BLE连接与操作
    Android蓝牙操作
    Cannot use JSX unless the '--jsx' flag is provided.
    PyQt打包可执行文件
    Springboot项目报错【java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader】
    typescript枚举字符串型不能使用函数问题
    beautifulsoap常用取节点方法
    numpy常用矩阵操作
    MYSQL 碎片查询
  • 原文地址:https://www.cnblogs.com/cutcop/p/13202456.html
Copyright © 2011-2022 走看看