PHP常用设计模式
工厂模式
一、什么是工厂模式
工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤。
二、为什么使用工厂模式
PHP中能够创建基于变量内容的类的新实例,减少主代码流中的基于条件复杂性; 同时如果类发生改变不需要所有的地方进行修改,只需要在工厂中进行修改 (无论对象被修改或者添加其他对象,Factory对象调用方式仍让是相同的)(集中实例化)
<?php
class A
{
function test(){
echo '输出';
}
}
class B
{
public $A;
function __construct($className)
{
$this->A = new $className();
}
function index(){
// var_dump($this->A);
$this->A->test();
}
}
$test = new B('A');
$test->index();
单例模式
一、什么是单例模式
作为对象的创建模式,单例模式确保某一个类只有一个实例,并且对外提供这个全局实例的访问入口。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
二、PHP单例模式三要素
- 需要一个保存类的唯一实例的静态成员变量。
- 构造函数和克隆函数必须声明为私有的,防止外部程序创建或复制实例副本。
- 必须提供一个访问这个实例的公共静态方法,从而返回唯一实例的一个引用。
三、为什么使用单例模式
使用单例模式的好处很大,以数据库操作为例。若不采用单例模式,当程序中出现大量数据库操作时,每次都要执行new操作,
每次都会消耗大量的内存资源和系统资源,而且每次打开和关闭数据库连接都是对数据库的一种极大考验和浪费。使用了单例模式,只需要实例化一次,不需要每次都执行new操作,极大降低了资源的耗费。
class A
{
/**
* 定义一个静态私有的属性存储实例化对象
*/
private static $instance;
private function __construct()
{
$this->test();
}
/**
* 防止克隆
*/
private function __clone()
{
// TODO: Implement __clone() method.
}
public static function getInstance()
{
// 判断是否存在已有实例,不存在则new一个新实例,确保只有一个实例
// instanceof 作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口。 这里用的是第一个
if (!self::$instance instanceof self) {
self::$instance = new A();
}
return self::$instance;
}
public function test()
{
echo '单例模式';
}
}
A::getInstance();
观察者模式
一、什么是观察者模式
一种一对多的依赖关系,让多个观察者对象监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己
二、为什么使用观察者模式
当一个对象的改变需要同事改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
观察者模式所作的工作其实就是在接触耦合。让耦合的双方都依赖于抽象类,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化
<?php
//被观察者接口
interface Observable
{
public function add($object);//添加观察者对象
public function del($object);//删除观察者对象
public function inform();//通知观察者
}
//观察者接口
interface observe
{
public function perform();//执行方法
}
class login implements Observable
{
//用来存储观察者对象
public $object = [];
public function add($object)
{
// TODO: Implement add() method.
$this->object[] = $object;
}
public function del($object)
{
// TODO: Implement del() method.
}
public function inform()
{
// TODO: Implement inform() method.
foreach ($this->object as $object){
$object->perform();
}
}
}
class A implements observe
{
public function perform()
{
echo '知行A';
}
}
class B implements observe
{
public function perform()
{
echo '执行B';
}
}
$new = new login();
$new ->add(new A());
$new ->add(new B());
$new->inform();
责任链模式
一、什么是责任链模式
又叫职责链模式。包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象
二、为什么使用责任链模式
可以降低系统的耦合度,简化对象的相互连接,同时增强给对象指派职责的灵活性,增加新的请求处理类也很方便;其主要缺点在于不能保证请求一定被接收,且对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便
<?php
$num = 10;
class A
{
public $class = 'B';
public function __construct($num)
{
if($num<10){
echo '我处理小于10';
}else{
//处理不了 交给上级
new $this->class($num);
}
}
}
class B
{
public $class = 'C';
public function __construct($num)
{
if($num<100){
echo '我处理小于100';
}else{
//处理不了 交给上级
new $this->class($num);
}
}
}
class C
{
public function __construct($num)
{
echo '什么都能处理';
}
}
new A($num);
注册树模式
一、什么是注册树模式
将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘。
二、为什么使用注册树模式
把创建出来的对象注册到全局树上,需要的时候取下来用,可以很好的管理创建的对象。
<?php
class login
{
//定义一个树枝用来保存果实
public static $instance;
//添加果实
public static function add($key,$object)
{
if(self::$instance[$key]){
return '已有实例';
}
self::$instance[$key] = new $object();
}
//销魂果实
public static function del($key)
{
unset(self::$instance[$key]);
}
//取得果实
public static function get($key)
{
if(!empty(self::$instance[$key])){
return self::$instance[$key];
}
return '没有实例';
}
}
class A
{
public function index()
{
echo '获取的实例';
}
}
//添加实例
login::add(0,'A');
//获取实例
(login::get(0))->index();
//删除实例
login::del(0);