博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式
阅读量:7012 次
发布时间:2019-06-28

本文共 1809 字,大约阅读时间需要 6 分钟。

单例模式的必要性:

 

1. 目的:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
2. 要点:
    1). 某一个类只能有一个实例;
    2). 必须自行创建这个实例;
    3). 必须自行向整个系统提供这个实例。
3. 作用:避免重复实例化,节省系统资源。例如在数据库操作方面,会大量存在数据库连接操作,单例类可以避免多次连接数据库而消耗资源,减轻对数据库服务器的压力。
单例类的写法:三私一公二静态
1、私有的构造方法:防止类外被实例化,从而失去单例的意义。
2、私有克隆方法:防止传到类外的对象被克隆,从而无法保证对象的唯一。
3、私有静态的属性:私有的目的是防止这个属性在类外被修改。用来保存在本类中生成的唯一一个实例。 静态的目的是什么呢?之所以静态,是因为该属性要被在静态方法中调用。
4、共有的静态方法:这个方法是唯一将实例传输到类外使用的途径。子所以是公有的,是因为要被在类外调用。之所以静态,是因为单例类中的构造方法是私有的,没办法用对象调用该方法,而只有静态方法才不需要对象调用。
这个公有的静态方法必须有返回值,将当前类中私有静态属性返回。而这个静态属性中已经存储了那个唯一的实例化后的对象。
备注:单例模式强调类的静态调用,保证一个进程对一个类的多次调用只产生一个对象。
案例   ---    连接数据库单例类
class Dbconn {        public $link;        private static $_instance;        private function __construct() {	 //连接数据库操作	   }        private function __clone(){}        public static function getInstance() {            //判断当前私有的属性$_instance是否是经过自身实例化来的一个对象?            if(!self::$_instance instanceof self) {                self::$_instance = new self();            }            return self::$_instance;        }    }
/*** 单例模式数据库连接项目实例*/
class Dbconn {    public $link;    private static $_instance;    private function __construct() {     $arr=Loadconfig::getConfig(); //钩子方法      $mylink=mysql_connect($arr['hostname'] , $arr['username'] , $arr['password']);      if($mylink){           mysql_query('set names '. $arr['charset']);          if(mysql_select_db($arr['dbname'])) {                $this->link = $mylink;            } else {                die('数据库连接失败');                   }        } else {            die('连接数据库服务器失败');       }    }    //私有化,禁止克隆这个对象    private function __clone() {}   //这个方法是为了获取一次实例,也就是一次数据库连接对象。   //必须通过此方法得到对象的引用   这个类用了单例模式的写法    public static function getInstance() {        if(!self::$_instance instanceof self) {            self::$_instance = new self();        }        return self::$_instance;    }
 
 

 

转载地址:http://srttl.baihongyu.com/

你可能感兴趣的文章
笔记-OC运行时问题扩展
查看>>
PHPstorm 优化、设置与提速篇
查看>>
[iOS] 从 application delegate 引申三点
查看>>
深入理解Java虚拟机(一)
查看>>
Docker Nginx 静态资源部署
查看>>
DSA数字签名算法
查看>>
Mongodb Mac安装
查看>>
中间件事务码R3AC1里Block Size的含义
查看>>
实战Android 上推下拉——隐藏、显示ActionBar
查看>>
GDB 调试 Mysql 实战(二)GDB 调试打印
查看>>
Spring AOP(三) Advisor类架构
查看>>
LeetCode 316. Remove Duplicate Letters
查看>>
第十三课时:递归组件的使用
查看>>
【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
查看>>
SpiderData 2019年2月18日 DApp数据排行榜
查看>>
react-refetch的使用小例子
查看>>
周末游攻略 - 南昌之行
查看>>
tcpdump查看Nginx长连接还是短连接
查看>>
Vue+thinkJs博客网站(二)之thinkJs的使用
查看>>
Electron学习笔记:主进程与渲染进程的通信方式
查看>>