当前位置: 首页 > 编程日记 > 正文

基础设计模式:单例模式+工厂模式+注册树模式

单例模式:

通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次。

使用场景:

一般数据库实例都会用单例模式

实现:

单例设计模式就是要一个类只能实例化一个对象。

要想让一个类只能实例化一个对象,就要让类先不能实例化对象,就是构造方法私有。

现在,要想实例化该类必须通过访问静态方法来实例化改类

为了防止实例多次,需要通过一个成员变量来控制加以判断

因为静态方法不能访问非静态成员,所以声明的成员也要是静态的,同时防止外部访问该成员,还要私有

class Singleton{private static $_instance;  //声明一个私有的,静态的成员属性$instance;private function __construct(){}  //构造方法私有,防止new实例化。public static function getInstance(){     //只能通过静态方法实例化对象if( !( self::$_instance instanceof Singleton ) )self::$_instance = new self();return self::$obj;}
private function __clone(){} //防止clone对象
  
private function __wakeup(){} //防止使用序列化。

  function query($sql){echo $sql;} }
/*通过静态方法实例化*/ $db = Singleton::getInstance();//访问对象中的成员 $db->query("select * from user");

 工厂模式:

工厂类就是一个专门用来创建其它对象的类。所有地方加载类都走工厂方法。

注册树模式:

小工程并不实用,对于大工程方便管理生成对象。

三个模式的结合使用:

一个数据库的单例模式,通过工厂方法调用,生成的对象注册到注册树中。

<?php/*** 单例模式*/
trait Singleton
{private static $_instance;private function __construct(){}public static function getInstance(){if (!(self::$_instance instanceof Singleton)) {self::$_instance = new Static();}return self::$_instance;}final private function __clone(){}
}/*** 数据库类,通过trait使用单例模式*/
class Database{use Singleton;public function query($sql){//return ret...
    }
}/*** 工厂方法,生成对象*/
class Loader
{/*** 创建对象方法,创建成功加入注册树* @param $cls* @return null|static*/public static function loadObject($cls){$obj = ObjectFinder::find($cls);if (!is_object($obj)) {$obj = $cls::getInstance();ObjectFinder::register($cls, $obj);}return $obj;}
}/*** 注册树类,存取工厂创建好的对象*/
class ObjectFinder
{protected static $_object;/*** 获取类对应的对象* @param $cls* @return null*/public static function find($cls){if (isset(self::$_object[$cls])) {return self::$_object[$cls];}return null;}/*** 注册对象* @param $cls* @param $obj* @return bool*/public static function register($cls, $obj){if (!is_object($obj) || isset(self::$_object[$cls])) {return false;}self::$_object[$cls] = $obj;return true;}/*** 销毁对象* @param $cls*/public static function destory($cls){if (self::find($cls)) {unset(self::$_object[$cls]);}}
}//创建一个
$db = Loader::loadObject("Database");

转载于:https://www.cnblogs.com/leezhxing/p/3647369.html

相关文章:

mac 配置 php,mac如何配置php环境

一、启动Apache两种方法1、打开网络共享打开"系统偏好设置"->"共享"&#xff0c;在"互联网共享"那一项前面打√。2、打开终端&#xff0c;输入sudo apachectl start这时需要输入密码&#xff0c;输入电脑密码即可,然后输入sudo apachectl &am…

LinkedBlockingQueue应用实例

并发库中的BlockingQueue是一个比较好玩的类&#xff0c;顾名思义&#xff0c;就是阻塞队列。该类主要提供了两个方法put()和take()&#xff0c;前者将一个对象放到队列中&#xff0c;如果队列已经满了&#xff0c;就等待直到有空闲节点&#xff1b;后者从head取一个对象&#…

s-stat 查看文件或者文件系统的状态信息

命令用法 stat [OPTION]... FILE... -L 查看链接文件-f 查看文件系统信息&#xff0c;而非文件信息-c --format%a 支持使用格式化字符串输出结果&#xff0c;支持\n,\t等转义字符,详细格式化情况使用man stat查看--printfFORMAT 支持格式化输出-t 以简洁的方式输出结果 常用…

梦想的地方!地球上最值得去的20个地方【组图】

如果你是一个热爱大自然的人你肯定会喜欢这个集合。地球上有太多的地方和风景值得我们这辈子至少要去看一次。大多数自然摄影师喜欢没有人出现在他们的照片中&#xff0c;他们想获得纯净、完美的风景&#xff0c;没有人类的影响。这篇文章展示了20个地球上最惊人的地方的照片&a…

php读取js验证码,PHP + JS 实现验证码功能

验证码是网站防止恶意攻击最常用的手段&#xff0c;怎样使用PHP来生成验证码呢&#xff0c;下面就直接上例子首先给出生成验证码的PHP代码&#xff1a;将上面的代码放在一个单独的php文件中&#xff0c;如&#xff1a;auth_code.php&#xff0c;最好不要讲验证码的代码放到其他…

poj1692

题意&#xff1a;两个数列&#xff0c;第一行的数字可以和第二行的数字连线。连线有如下条件&#xff0c;被连上的两数字必须相等&#xff0c;且每个数字只能连一条线&#xff0c;每条连线必须与且仅与另一条连线相交&#xff0c;相交两连线上的数字不能相等。问最多能连多少条…

MongoDB 学习使用

博客教程&#xff1a; https://jingyan.baidu.com/article/dca1fa6f0428a4f1a440522e.html转载于:https://www.cnblogs.com/harlem/p/10148315.html

C语言的双向链表头插法和尾插法,指定节点删除

文章目录前言头插法尾插法删除节点测试代码如下前言 双向链表和单链表的唯一区别就是多个一个指针域而已&#xff0c;该指针域可以访问链表的上一个节点。 关于构造双向链表的过程我们常见的有两种方法&#xff0c;和单链表一样&#xff1a;头插法和尾插法。 头插法&#xff…

机房收费系统之uml图——初版

说起uml图&#xff0c;在我心中最难的当属类图无疑。虽然敲了三层的小例子&#xff0c;但真正让把三层和uml图结合起来&#xff0c;并且还要考虑设计模式的时候&#xff0c;总是让人有一种无从下手的感觉&#xff0c;不过还好&#xff0c;通过这半个多月的思考与探索&#xff0…

php扩展开发中文教程.pdf,PHP扩展开发系列教程-1

PHP的核心由两部分组成。最底层是zend引擎(ZE)。另一部分是PHP内核&#xff0c;她绑定了SAPI层(Server Application Programming Interface).###扩展的内存管理_____________________________________________________________1 依赖ZE内部管理2 自己写内存管理##创建基础hello…

node.js(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.简介 Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it light…

Android Wifi 主动扫描 被动扫描

介绍主动扫描&#xff0c;被动扫描以及连接的wifi的扫描过程 参考文档 《802.11无线网络权威指南》 《80_Y0513_1_QCA_WCN36X0_SOFTWARE_ARCHITECTURE.pdf》(高通文档) 被动扫描&#xff08;passive scanning&#xff09; 可以节省电池的电力&#xff0c;因为不需要传送任何信号…

C语言的单链表实现队列

队列是一种FIFO&#xff08;先入先出&#xff09;的数据结构 C的STL std::queue q; 相关的队列操作&#xff0c;包括 q.empty() 判读队列是否为空 q.front() 返回队列的首元素 q.back() 返回队列的末尾元素 q.pop() 弹出队列的头部 q.push(x) 将x添加至队列 q.size() 返回队列…

hdu 1561 The more, The Better_树状dp

题目链接 题意&#xff1a;给你一棵树&#xff0c;各个节点都有价值&#xff08;除根节点&#xff09;&#xff0c;从根节点出发&#xff0c;选择m个节点&#xff0c;问最多的价值是多小。 思路&#xff1a;很明显是树状dp&#xff0c;遍历树时背包最优价值&#xff0c;dp[i][k…

java课设推荐,《Java程序设计》课程设计报告推荐.docx

《Java程序设计》课程设计报告推荐《Java程序设计》课程设计报告2015—2016学年 第一学期设计题目整数进制转换学生姓名邹晓刚学 号0专业班级信管1303指导教师 姜国权 2015年12月31日整数进制转换设计任务书1.1题目与要求 本人计划编写一个十进制整数转换为二八十六进制整数的进…

解析Erlang日志组件lager的lager_transform模块

为什么80%的码农都做不了架构师&#xff1f;>>> 使用 lager 的时候&#xff0c;在编译应用的时候&#xff0c;需要加入选项 {parse_transform, lager_transform} erlc 会在编译你的项目源代码的时候&#xff0c;把生成的 abstract format forms 交给 lager_transfo…

Session 常见操作

对于敏感、重要的信息&#xff0c;建议要存储在服务器端&#xff08;Session是存储在服务器端的&#xff09;&#xff0c;不能存储在浏览器中&#xff0c;如用户名、余额、等级、验证码等信息 Session依赖于Cookie session数据的获取 session:请求上下文对象&#xff0c;用于处…

C++的STL队列实现栈

使用C的队列STL实现一个栈的数据结构 实现以下四个函数&#xff1a; 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.empty() : 判断栈是否是空 队列的数据结构为先入先出&#xff0c;栈的数据结构为先入后出&#xff1b; 即队列的元素顺…

PHP实现XML传输

sendXML.php <!--发送XML的页面--> <?php$xml_data <xml>...</xml>;//发送的xml $url http://localhost/getXML.php;//接收XML地址$header "Content-type: text/xml";//定义content-type为xml $ch curl_init(); //初始化curl curl_setop…

wordpress短代码转php,WordPress中的shortcode短代码功能使用详解

WordPress 从 2.5 的版本开始&#xff0c;增加了一个 shortcode (短代码) API ,类似于 BBS 上的 BBCode &#xff0c; shortcode 也可以很方便的为文章或页面增加功能&#xff0c;并且 shortcode 的比起 BBCode 更加灵活和强大。下面 Kayo 为大家介绍一下 shortcode 。一.short…

在ESXi主机上关闭无响应的虚拟机

适用情况该方法适用于以下情况: ESXi主机上的虚拟机不能关闭。虚拟机无响应且不能停止。目的这篇文章描述在ESXi环境中如何正确的关闭一台无响应的虚拟机。注意&#xff1a; 这篇文章只适用于ESXi主机&#xff0c;不适用于ESX主机。对于ESX主机&#xff0c;请参考 Powering off…

React和Jquery比较

Jquery的工作方式&#xff1a; 假如你需要给一个按扭添加一个点击事件。 首先根据CSS规则找到对应的dom元素&#xff0c;挂上一个匿名事件处理函数&#xff0c;在事件处理函数中&#xff0c;选中那个需要被修改的DOM元素&#xff0c;读取他的文本值&#xff0c;加以修改&#x…

C++的STL栈实现队列

使用内部存储结构为栈的方法实现一个队列&#xff0c;要求实现该队列的如下方法&#xff1a; 1.push(x) : 将元素x压入队列中 2.pop() : 弹出(移除)队列头部元素 3.peek() : 返回队列头部元素(即为front) 4.empty() : 判断队列是否是空 栈的数据结构为先入后出&#xff0c;队列…

如何设置SOLR的高亮 (highlight)?

打开SOLR的核心配置文件&#xff1a; solrconfig.xml找到 standard request handler写入以下XML配置代码&#xff1a;[c-sharp] view plaincopy <requestHandler name"standard" class"solr.SearchHandler" default"true"> <!-- def…

java快排算法解读,java 快排的思路与算法

java 快排的思路与算法有时候面试的时候的会问道Arrays.sort()是怎么实现的&#xff0c;我以前根本不知道是什么东西&#xff0c;最近点进去看了一下。直接吓傻&#xff0c;//看到这个时候还是比较淡定的&#xff0c;可怕的事情来了。public static void sort(int[] a) {DualPi…

SQL:EXISTS的用法理解(转)

摘自&#xff1a;http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerIDc.CustomerID) 这里面的EXISTS…

002.Heartbeat部署及httpd高可用

一 前期准备 1.1 依赖准备 编译安装需要依赖的包&#xff0c;如gcc等&#xff1a;yum -y install gcc gcc-c make glibc kernel-devel kernel-headers autoconf automake libtool glib2-devel libxml2 libxml2-devel libxslt-devel libtool-ltdl-devel wget asciidoc libuuid-d…

C++的STL栈实现获取栈中最小元素的成员

实现一个获取栈中最小数据成员的函数&#xff0c;该栈支持如下操作&#xff1a; 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.getMin() : 返回栈内最小元素 要求时间复杂度为O(1) 这里关键是如何获取最小值&#xff0c;栈中的元素不断…

java servlet applet,详解Java Servlet与Applet比较

Java Servlet与Applet相似之处&#xff1a;◆它们不是独立的应用程序&#xff0c;没有main()方法。◆它们不是由用户或程序员调用&#xff0c;而是由另外一个应用程序(容器)调用。◆它们都有一个生存周期&#xff0c;包含init()和destroy()方法。Java Servlet与Applet不同之处&…

NTP时间同步服务器搭建

转载&#xff1a;http://blog.s135.com/post/281/ 一、搭建时间同步服务器1、编译安装ntp server tar zxvf ntp-4.2.6.tar.gzcd ntp-4.2.6./configure --prefix/usr/local/ntp --enable-all-clocks --enable-parse-clocksmake && make install注&#xff1a;如以上下载…