时间:2022-11-03 07:26:25 | 浏览:5175
单例模式
单例模式的含义:
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
单例模式的三个要素:
1. 保存类唯一实例的静态变量。
2. 构造函数和克隆函数必须是私有的,放在外部去实例化,这样就不存在单例模式的意义。
3. 提供一个可供外部访问的公共静态方法,这个方法返回该类的唯一实例。
单例模式的意义:
在 PHP 中的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的 new 操作消耗的资源。而不完全是对系统资源的节省, 可以避免重复实例化,因为 PHP 每次实例化一个类之后都会清理掉对应的资源,当再次使用的时候又会在重新去实例化一次。
单例模式使用的场景:
1. 数据库操作,减少对数据路的 new 操作,从而减少内存资源和系统资源的消耗。
2. 配置资源的共享,在一个系统中,配置资源都是全局的,使用单例模式也可以减少每次去读取配置带来的内存和系统资源的消耗。
代码演示:
<?php
class Single
{
public static $attribute = "";
public static $instance = "";
private function __construct($attribute = "个人技术")
{
self::$attribute = $attribute;
}
public static function getInstance($attribute = "我是编程浪子走四方1")
{
if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
return self::$instance;
}
}
单例模式和非单例模式的区别:
class Single {
public function index() {
return "";
}
}
$single1 = new Single();
$single2 = new Single();
var_dump($single1);
var_dump($single2);
if ($single2 === $single1) {
echo "是同一个对象";
} else {
echo "不是同一个对象";
}
// object(Single)#1 (0) {
// }
// object(Single)#2 (0) {
// }
// 不是同一个对象
class Single2 {
// 1.声明一个静态属性,用户保存类的实例
public static $instance;
//3. 将构函数私有化,避免外部new(每new一次,就不是同一个实例)
private function __construct() {
}
// 2.声明一个静态的公共方法,用户外部调用本类的实例
public static function getInstance() {
if (!(self::$instance instanceof self)) {
self::$instance = new self;
}
return self::$instance;
}
//3. 克隆函数私有化,避免外部clone(每clone一次,就不是同一个实例)
private function __clone() {
}
}
$singleDemo1 = Single2::getInstance();
$singleDemo2 = Single2::getInstance();
var_dump($singleDemo1->getInstance());
var_dump($singleDemo2->getInstance());
if ($singleDemo1 === $singleDemo2) {
echo "是同一个对象";
} else {
echo "不是同一个对象";
}
// object(Single2)#3 (0) {
// }
// object(Single2)#3 (0) {
// }
// 是同一个对象
工厂模式
工厂模式的有含义:
负责生成其他对象的方法。简单的描述就是通过一个工厂类,去实例化其他类或者方法。
工厂模式的意义:
通过使用工厂模式,减少因为多处 new 同一个类,当这个类发生变法时,则需要多处修改。
代码演示:
<?php
class Factor
{
public static function createDB()
{
echo "我生产了一个DB实例";
return new DB;
}
}
class DB
{
public function __construct()
{
echo __CLASS__ . PHP_EOL;
}
}
$db = Factor::createDB();
注册树模式
注册数的含义:
注册树就是将多个对象注册在一个对象池中,当我们需要使用时,直接从对象池获取即可。
注册数模式的优点:
单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过 new 建立实例对象的方法。
那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。
首先,单例模式创建唯一对象的过程本身还有一种判断,即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。
每次创建实例对象都要存在这么一层判断。
工厂模式更多考虑的是扩展维护的问题。
总的来说,单例模式和工厂模式可以产生更加合理的对象。怎么方便调用这些对象呢?
而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因 而,注册树模式应运而生。
不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我 “插到” 注册树上。我用某个对象的时候,直接从注册树上取 一下就好。
这和我们使用全局变量一样的方便实用。 而且注册树模式还为其他模式提供了一种非常好的想法。
代码演示:
<?php
/**
* 单例模式
*/
class Single
{
public static $attribute = "";
public static $instance = "";
private function __construct($attribute = "个人技术")
{
self::$attribute = $attribute;
}
public static function getInstance($attribute = "个人技术1")
{
if (!(self::$instance instanceof self)) self::$instance = new self($attribute);
return self::$instance;
}
}
/**
* 工厂模式
*/
class Factory
{
public static function createObj()
{
return Single::getInstance("个人技术");
}
}
/**
* 注册模式
* 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找.
* 需要如下几个操作:
* 1.注册
* 2.存放对象池
* 3.获取
* 4.销毁
*/
Class Register
{
// 用一个数组来当做对象池,键当做对象别名,值存储具体对象
public static $objTree = [];
// 将对象放在对象池
public static function set($key, $val)
{
return self::$objTree[$key] = $val;
}
// 通过对象别名在对象池中获取到对象别名
public static function get($key)
{
return self::$objTree[$key];
}
// 通过对象别名将对象从对象池中注销
public static function _unset($key)
{
unset(self::$objTree[$key]);
}
}
Register::set("single", Factory::createObj());
$single = Register::get("single");
print_r($single);
echo $single::$attribute;
其实现在的自媒体也算是一种圈子赚钱的模式,分享某个行业的内容,吸引粉丝关注。不同的人群,赚钱的模式都是不一样的。这一期文章,我就想分享一下,普通人赚钱的6种模式,看看你是哪属于哪一类。第四种:资源赚钱靠资源赚钱的模式,大部分都是一些创业者。
人很年轻,比我和史小嘴年龄小,引流特别厉害,而且不是人工引流,人家做了个程序,这个程序可以抵100个人的工作产出。上次我们刚见完面,他就要去见客。上周到北京,在史小嘴工作室里,见到了尹强老师。因为跑通了引流这件事,现在有一大堆公司要找他合作。
读特客户端·深圳新闻网2022年8月21日讯(深圳晚报记者李超通讯员马骊)“从申报到放行,仅用了不到5分钟的时间。”深圳市富森供应链管理有限公司报关经理陆四辉对深圳海关的通关速度连连称赞。近日,富森公司进口一批电子产品,选择“两步申报
文章纯属原创,版权归本作者所有,欢迎个人转发分享。年轻时候,王阿姨和老伴只生了一个儿子。由于只有一个孩子,王阿姨和老伴两个都对孩子疼爱有加甚至有些宠溺,但他们也并没有觉得这样的教育方式有何错误。在孩子的生活中,孩子都是处于"衣来伸手、饭来张
首先介绍一下,我从事玩具批发,对现在市场上售卖的模式谈一下,让生手小白一下进二百个玩具可行不。答案是必须的,因为你没有量是卖不动的,也就是货卖堆山。关于今日头条火爆的外贸玩具甩卖模式,本人有一点点经验谈一下,不足之处望抛砖引玉大家一起聊聊天。
球球大作战起名神器上线啦,球宝再也不用为取名字而烦恼了,起名神器中有关键字皮肤、名字颜色修改、个性花体名字,想要拥有个性名字绝不是问题,快来试试吧~球球大作战大逃杀测试服要怎么玩,怎样才可以有测试服的资格。
这是今天早上在乳山银滩大拇指广场的沙滩上拍摄到的。刚开始的时候还只有一条线是红的。慢慢的整个天和沙滩都成了红色的。摄影人在海边拍摄。好百年在遛狗,给海边多了一道风景。远处的山可能是荣城的铁槎山。这几个人正在摆pose拍照。一摄影人向我这走了
自夏季治安打击整治“百日行动”开展以来,梧州市公安局实施“3+3”(中心+机制、巡防+整治、宣传+防范)模式,有力推进“百日行动”落地见效,梧州市社会治安形势持续向好,2022年第二季度梧州市群众安全感排名全区第1位。推行“中心+机制”,严
近年来,我市聚焦广大老年人在养老服务领域的“急难愁盼”问题,着力持续深化养老服务改革,积极探索养老服务新路子,逐步形成具有鲜明特色的“云浮模式”,初步构建起以居家为基础、社区为依托、机构为补充、医养相结合的多层次养老服务体系,满足老年人多样
近一周来,高温天气持续,成都用电量持续增长,为确保电网安全可靠运行,成都市民和各行各业也行动起来,成都春熙路商圈开启了“省电模式”。封面新闻记者刘陈平摄影报道8月2。8月27日,今夜 成都春熙路商圈“调高亮度” 迎来“省电模式”后的首个周末。