zoukankan      html  css  js  c++  java
  • php设计模式-单例模式

    1) 什么是单例模式

    2)为什么使用单例模式

    3)单例模式的使用方法

    单例模式介绍与说明:

      什么是:只会生产一个实例对象的类,就叫做单例模式。单例模式生成一个对象后, 该对象可以被其它众多对象所使用。

      为什么:在开发过程中,往往有其他同事在不知情的情况下很容易就轻而易举的 new 一个对象出来,如果这样的情况很多,会很大程度上引起内存资源浪费。

      举栗子:像数据库连接的调用以及常用的基类都可以使用单例模式来实现。

      如何做:实现一个实例类将它存在一个静态私有变量中,在处理这个类不会被克隆、不会被反序列化就可以真正意义上实现单例模式。

    代码案例:普通类的调用

      

    <?php
    
    /**
     * 普通类的调用
     * Class Login
     */
    class Login
    {
        protected static $name;
    
        public function __construct( $userName )
        {
            self::$name = $userName;
        }
    
        public function init()
        {
            echo self::$name;
        }
    }
    
    $obj  = new Login(111);
    $obj1 = clone $obj;
    $obj2 = unserialize(serialize($obj));
    
    var_dump($obj);
    var_dump($obj1);
    var_dump($obj2);
    
    # 由输出可以见每一个对象都不一样
    
    //object(Login)#1 (0) {
    //}
    //object(Login)#2 (0) {
    //}
    //object(Login)#3 (0) {
    //}

    单例模式的使用

    <?php
    
    class BaseLogin 
    {
        private static $name;
        private static $instance;
    
        /**
         * 防止new 多个实例
         * BaseLogin constructor.
         * @param $name
         */
        private function __construct($name)
        {
            self::$name = $name;
        }
    
        /**
         * 单例类的出口
         * @return mixed
         */
        public static function getInstance()
        {
            $args = func_get_args();
    
            if ( !self::$instance instanceof self ) {
                self::$instance = new self( ...$args );
            }
    
            return self::$instance;
        }
    
        public function index()
        {
            echo self::$name;
        }
    
        /**
         * 以防被克隆
         */
        private function __clone()
        {
        }
    
        /**
         * 防止返序列化
         */
        private function __wakeup()
        {
        }
    
    }
    
    # 这里实例化对象会报错,不给实例了,所以只能走单一入口
    # $obj = new BaseLogin();
    # var_dump($obj);
    # Fatal error: Uncaught Error: Call to private BaseLogin::__construct()
    
    $result = BaseLogin::getInstance("你好")->index();
    
    var_dump($result); # 你好
    
    $login1 = BaseLogin::getInstance("111");
    $login2 = BaseLogin::getInstance("222");
    var_dump($login1);
    var_dump($login2);
    
    # 由下可见是同一个类
    //你好NULL
    //object(BaseLogin)#1 (0) {
    //}
    //object(BaseLogin)#1 (0) {
    //}
  • 相关阅读:
    HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6
    多区域显示(6)-版面布局
    静态变量和成员变量的区别 && 成员变量和局部变量的区别
    java基础学习_面向对象(上)02_day07总结
    java基础学习_面向对象(上)01_day07总结
    面向对象的概述
    面向对象思想的引入
    Failed to create the Java Virtual Machine(zt)
    eclipse web开发Server配置
    javamail接收邮件(zt)
  • 原文地址:https://www.cnblogs.com/dump/p/12452740.html
Copyright © 2011-2022 走看看