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

    单例模式按字面来看就是某一个类只有一个实例,这样做的好处还是很大的,比如说数据库的连接,我们只需要实例化一次,不需要每次都去new了,这样极大的降低了资源的耗费。

    单例类至少拥有以下三种公共元素:

        必须拥有一个构造函数,并且必须被标记为private。
        拥有一个保存类的实例的静态成员变量。
        拥有一个访问这个实例的公共的静态方法

    另外、需要创建__clone()方法防止对象被复制(克隆)

    具体使用方面,我在下面php实例中注释的很清楚:

    <?php
        	class Mysql{
        		//该属性用来保存实例
        		private static $conn;
        		//构造函数为private,防止创建对象
        		private function __construct(){
        			$this->conn = mysql_connect('localhost','root','');
        		}
        		//创建一个用来实例化对象的方法
        		public static function getInstance(){
        			if(!(self::$conn instanceof self)){
        				self::$conn = new self;
        			}
        			return self::$conn;
        		}
        		//防止对象被复制
        		public function __clone(){
        			trigger_error('Clone is not allowed !');
        		}
        		
        	}
        	//只能这样取得实例,不能new 和 clone
        	$mysql = Mysql::getInstance();
        ?>
    

     单例实现方法:

    /**
    * $_instance必须声明为静态的私有变量
    * 构造函数和析构函数必须声明为私有,防止外部程序new
    * 类从而失去单例模式的意义
    * getInstance()方法必须设置为公有的,必须调用此方法
    * 以返回实例的一个引用
    * ::操作符只能访问静态变量和静态函数
    * new对象都会消耗内存
    * 使用场景:最常用的地方是数据库连接。 
    * 使用单例模式生成一个对象后,
    * 该对象可以被其它众多对象所使用。 
    */
    class InstanceDemo {
     
    	//保存类实例的静态成员变量
    	private static $_instance;
    	 
    	//private标记的构造方法
    	private function __construct(){
    		echo ´This is a Constructed method;´;
    	}
    	 
    	//创建__clone方法防止对象被复制克隆
    	public function __clone(){
    		trigger_error(´Clone is not allow!´,E_USER_ERROR);
    	}
    	 
    	//单例方法,用于访问实例的公共的静态方法
    	public static function getInstance(){
    		if(!(self::$_instance instanceof self)){
    			self::$_instance = new self;
    		}
    		return self::$_instance;
    	}
    	 
    	public function test(){
    		echo ´调用方法成功´;
    	}
     
    }
    

     调用方法:

    //正确方法,用双冒号::操作符访问静态方法获取实例
    $demo = InstanceDemo ::getInstance();
    $demo->test();
    

     php单例模式 保存实例的静态变量 为什么要私有?

        其实你这里不应该问为什么要私有,应该问为什么不公有。其实定义为protected也是可以的。不定义为公有,是为了防止直接访问这个静态实例,因为直接访问这个对象的时候,它有可能还没有初始化。所以,在单例模式中,我们通常提供一个获取这个静态实例的方法,而这个方法的第一步就是检测这个实例是不是已经初始化过,如果没有初始化就先初始化,然后再是返回这个静态实例。

  • 相关阅读:
    IBatis.Net使用总结(三)-- IBatis实现分页返回数据和总数
    IBatis.Net使用总结(二)-- IBatis返回DataTable/DataSet(网上例子的集合)
    IBatis.Net使用总结(一)-- IBatis解决SQL注入(#与$的区别)
    ibatis.net 中SqlMaps的xml文件的例子
    ibatis.net MVC 单元测试 错误解决方法
    TreeView checkbox 全选
    Win下Eclipse提交Hadoop程序出错:org.apache.hadoop.security.AccessControlException: Permission denied: user=D
    端口被占用怎么办?如何查看win7电脑端口是否被占用
    Python 3.7运行别人的Python 3.8项目,报Cannot run program "D:pythonpython.exe"解决办法
    Python学习系列之常见错误TypeError,try...except...finally等异常处理机制(二十二)
  • 原文地址:https://www.cnblogs.com/zhuiluoyu/p/5266690.html
Copyright © 2011-2022 走看看