PHP设计模式(一)
1)工厂模式
工厂模式是用工厂方法生成对象,而不是直接new一个对象。假设我们在Config命名空间下有一个名叫Db的数据库操作类,用普通的方法,如果我们想去创建一个Db的对象,我们会直接new一个出来。
$db = new \Config\Db();
工厂模式就是用一个工厂方法替换掉直接new一个对象的操作,以后想创建对象就调用这个工厂方法。
<?php
namespace Config;
class Factory{
static public function createDb(){
$db = new Db();
return $db;
}
}
$db = \Config\Factory::createDb();
工厂模式有什么好处呢, 我们的项目中多处都对Db类进行了new的操作,如果这个类发生了一些更改,比如说类名或者是参数的改变,没用工厂模式的话我们就需要进行多处更改,而工厂模式只需要改这个工厂类就行了。
2)单例模式
单例模式使某个类的对象仅能创建一次,通常一个项目中会多次用的Db这个数据库连接类,如果在每个地方都调用工厂方法创建一个数据库连接类,这样是比较消耗资源的,我们只需要一个数据库连接,单例模式就是来解决这个问题的。
我们打开Db类,首先把构造方法设置为私有的,这样就禁止了在其他地方直接new我们的Db类
<?php
namespace Config;
class Db{
static protected $db;
private function __construct(){
}
static public function getInstance(){
//条件判断Db类是否已经new过
if (self::$db) {
return self::$db;
} else {
//构造方法被设置为了私有的,外部不能直接new,但自己内部可以new
self::$db = new self();
return self::$db;
}
}
//下面省略一系列操作数据库的方法
}
Db类的构造方法设置为了私有的,那我们在工厂类中也不能直接new了,现在来修改我们的工厂类
<?php
namespace Config;
class Factory{
static public function createDb(){
$db = Db::getInstance;
return $db;
}
}
现在不管我们调用多少次工厂方法,我们的数据库连接都只会被创建一次。
3)注册树模式
注册树模式可以把我们的对象放在全局的树上,让对象可以全局共享
下面我们来编写一个注册树的类,包含set,get,_unset三个操作。
<?php
namespace Config;
class Register{
protected static $objects;
static public function set($alias,$object){
self::$objedts[$alias] = $object;
}
static public function get($name){
return self::$objedts[$name];
}
//unset是php中的关键词,所以起名为_unset
static public function _unset($alias){
unset(self::$objedts[$alias]);
}
}
下面我们再把工厂方法改一下
<?php
namespace Config;
class Factory{
static public function createDb(){
$db = Db::getInstance;
//把单例模式生成的对象放在注册树上
Register::set('db',$db);
}
}
现在这个工厂方法只需要调用一次,以后再需要使用数据库连接对象,直接从全局的注册树上拿就行了
$db = Register::get("db");
至于这个工厂方法是么时候调用,可以在程序初始化的时候,我们的业务逻辑代码只需要在注册树上把这个对象读取出来即可。至此,三种最基本的设计模式就介绍完了。
PHP设计模式(一)的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- [mysql]linux mysql 读写分离
[mysql]linux mysql 读写分离 作者:flymaster qq:908601287 blog:http://www.cnblogs.com/flymaster500/ 1.简介 当今M ...
- java中异常的处理
异常分为运行时的异常和检测异常: java提供了两种异常机制.一种是运行时异常(RuntimeExepction),一种是检查式异常(checked execption). 运行时的异常就是在java ...
- Retrofit的文件上传和进度提示
2019独角兽企业重金招聘Python工程师标准>>> 1.写一个上传监听的接口: /** * Created by Zzm丶Fiona on 2017/7/31. */ publi ...
- 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类
此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...
- #Week1 Introduction
一.What is Machine Learning 课程里主要给了两个供参考的定义: By Arthur Samuel: Field of study that gives computers th ...
- 数学--数论--hdu 5878 I Count Two Three(二分)
I will show you the most popular board game in the Shanghai Ingress Resistance Team. It all started ...
- poj1251 Jungle Roads Kruskal算法+并查集
时限: 1000MS 内存限制: 10000K 提交总数: 37001 接受: 17398 描述 热带岛屿拉格里山的首长有个问题.几年前,大量的外援花在了村庄之间的额外道路上.但是丛林不断地超 ...
- CF1324F Maximum White Subtree——换根dp
换根dp,一般用来解决在无根树上,需要以每个节点为根跑一边dfs的dp问题 我们做两遍dfs 先钦定任意一个点为根 第一遍,算出\(f_i\)表示\(i\)的子树产生的答案,这里,子树指的是以我们钦定 ...
- 服务器安装JDK
1.卸载OpenJDK, 安装OracleJDK a.一般的LINUX发行版内置OpenJDK, 相当于JDK的开源版本(我们平时使用的JDK特指OracleJDK) b.OpenJDK 不能使用ja ...
- Python+wxpy 实现微信消息轰炸
需要导入wxpy,在终端中输入以下命令即可 pip install wxpy 如果没有pip先安装pip,安装好了的直接输入命令即可,安装好了但是显示没有安装的可能是没有将pip添加到PATH中,需要 ...