• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>设计模式

上一篇: 多态

下一篇: php命名空间

设计模式

单例模式

单例模式是php提供的一种模式,它指的是在设计一个类时,需要保证整个程序运行期间针对该类只存在一个实例对象,就像世界只有一个太阳,假如现在要设计一个类表示太阳,该类只能有一个实例对象,否则就违背了客观事实。

所谓单例模式,即在应用程序中最多只有该类的一个实例存在,一旦创建,就会一直存在于内存中

应用场景:单例设计模式常应用于数据库类设计,采用单例模式,只连接一次数据库,防止打开多个数据库连接

一个单例类应具备以下特点:

  • 单例类不能直接实例化创建,而是只能由类本身实例化。因此,要获得这样的限制效果,构造函数必须标记为private,从而防止类被实例化
  • 需要一个私有静态成员变量来保存类实例和公开一个能访问到实例的公开静态方法
  • 为了防止他人对单例类实例克隆,通常还为其提供一个空的私有__clone()方法

案例

<?php
	class Database{
		private static $instance=null;//定义一个私有的静态属性$instance
		//声明一个构造方法
		private function __construct(){
			$this->conn=mysql_connect("localhost","root","123456");
			echo "得到一个conn<br>";
		}
		//只能通过这个方法才能返回本类的对象,该方法是静态方法
		public static function getInstance(){
			//如果本类中的$instance 为空,说明它还没被实例化过
			if(self::$instance==null){
				self::$instance=new self(); //实例化本类对象
			}
			return self::$instance; //返回本类对象
		}
		//阻止用户复制对象
		private function __clone(){
		}
	}
	$db1=Database::getInstance();
	$db2=Database::getInstance();
	if($db1===$db2){
		echo "db1和db2是同一个对象";
	}else{
		echo "db1和db2不是是同一个对象";
	}
?>

工厂模式

共产模式的作用是就是“生产”对象工厂的方法参数是要生产的对象名。

工厂设计模式常用于根据输入参数的不同或者应用程序配置的不同来创建一种专门用来实例化并返回其对应的类的实例

使用场景:使用方法 new实例化类,每次实例化只需调用工厂类中的方法实例化即可

优点:由于一个类可能会在很多地方被实例化。当类名或参数发生变化时,工厂模式可简单快捷的在工厂类下的方法中 一次性修改,避免了一个个的去修改实例化的对象

案例:使用工厂模式获取两个驱动对象

在根目录创建mysql.php文件

<?php
    class mysql{
        //操作mysql驱动类
    }
?>

再次创建sqllite.php文件

<?php
    class sqllite{
        //操作sqlite的驱动类
    }
?>

最后定一个工厂方法获取驱动对象

<?php
	header('content-type:text/html;charset=utf-8');
	class db{
		//工厂方法
		public static function factory($type){
			if(include_once $type . '.php') {
				$classname=$type;
				return new $classname();
			}else{
				echo "出错了";
			}
		}
	}
	//获取mysql驱动对象
	$mysql=db::factory("mysql");
	//获取sqllite驱动对象
	$sqllite=db::factory("sqllite");
	var_dump($mysql);
	echo"<br>";
	var_dump($sqllite);
?>

观察者模式

描述当一个对象状态发生变化时,依赖它的对象全部收到通知,并自动更新

场景一个事件发生后,要执行一连串更新操作,传统的编程方式,就是在时间得代码之后直接加入处理的逻辑,当更新的逻辑增多之后,代码会变的难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码,观察者模式实现了低耦合,非侵入式的通知和更新机制

<?php

/**
 * @desc 观察者
 * Class Observer
 */

interface Observer
{
    function update();
}

class Event
{
    private $observers = [];

    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update();
        }
    }

    public function trigger()
    {
        echo "Event trigger!!!\r\n";
    }
}

class Observer1 implements Observer
{
    public function update()
    {
        echo "observer1 update\r\n";
    }
}

class Observer2 implements Observer
{
    public function update()
    {
        echo "observer2 update\r\n";
    }
}

$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->trigger();
$event->notify();

注册模式

注册模式,解决全局共享和交换对象,已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可,将对象注册到全局的数组上,任何地方可以直接去访问

<?php

/**
 * Class Register
 */
class Register
{
    /**
     * @var 全局数组
     */
    protected static $arr;

    /**
     * @desc 设定对象
     * @param $key
     * @param $obj
     */
    public static function set($key, $obj)
    {
        self::$arr[$key] = $obj;
    }

    /**
     * @desc 获取对象
     * @param $key
     * @return mixed
     */
    public static function get($key)
    {
        return self::$arr[$key];
    }

    /**
     * @desc 删除对象
     * @param $key
     */
    public static function remove($key)
    {
        unset(self::$arr[$key]);
    }
}

适配器模式

描述:将各种不同的函数接口封装成统一的API

场景:PHP的数据库连接方式有多种MySQL、MySQLI、PDO,可以用适配器统一,适用不同的数据库操作,封装成一个统一的API,类似场景还有cache适配器,可以将memache、redis、file、apc等不同的缓存,统一成一致的

实现方式:首先定义一个接口,然后有几种不同的情况,就写几个类实现接口

<?php

interface Db
{
    function connect();
    function query();
}

class Adapter implements Db
{
    private $adapter;

    public function __construct($obj)
    {
        $this->adapter = $obj;
    }

    public function connect()
    {
        $this->adapter->connect();
    }

    public function query()
    {
        $this->adapter->query();
    }
}

class MySQL_mysql implements Db
{
    protected $conn;

    public function connect()
    {
        echo "I'm MySQL connect!!!\r\n";
    }

    public function query()
    {
        echo "I'm MySQL query!!!\r\n";
    }
}

class MySQL_mysqli implements Db
{
    protected $conn;

    public function connect()
    {
        echo "I'm MySQLi connect!!!\r\n";
    }

    public function query()
    {
        echo "I'm MySQLi query!!!\r\n";
    }
}

class MySQL_pdo implements Db
{
    protected $conn;

    public function connect()
    {
        echo "I'm MySQL_PDO connect!!!\r\n";
    }

    public function query()
    {
        echo "I'm MySQL_PDO query!!!\r\n";
    }
}

$a = new MySQL_mysql();
$b = new MySQL_mysqli();
$c = new MySQL_pdo();

$adapter = new Adapter($a);
$adapter->connect();
$adapter->query();

$adapter = new Adapter($b);
$adapter->connect();
$adapter->query();

$adapter = new Adapter($c);
$adapter->connect();
$adapter->query();

上一篇: 多态

下一篇: php命名空间