工厂模式
工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。
使用工厂模式的好处是如果你想要更改所实例化的类名等,则只需要更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方。
目的:为系统结构提供动态拓展机制,减少了耦合。
<?php header(‘Content-Type:text/html;charset=utf-8‘); /** * 简单工厂模式(静态工厂模式) */ /** * interface people */ interface people { public function say(); } /** * Class man 继承people的男人类 */ class man implements people { public function say() { echo "男人<br>"; } } /** * Class woman 继承people的女人类 */ class woman implements people { public function say() { echo "女人<br>"; } } /** * Class SimpleFactory 工厂类 */ class SimpleFactory { // 简单工厂里的静态方法-用于创建男人对象 static function createMan() { return new man(); } // 简单工厂里的静态方法-用于创建女人对象 static function CreateWoman() { return new woman(); } } /** * 具体调用 */ $man = SimpleFactory::createMan(); $man->say(); $woman = SimpleFactory::CreateWoman(); $woman->say();
单例模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式是一种常见的设计模式,在计算机中,线程池,缓存,日志对象,对话框,数据库操作等常被设计成单例模式。
单例模式有以下几个特点:
(1)只能有一个实例
(2)必须自行创建这个实例
(3)必须给其他对象提供这一实例
使用单例模式的原因:
PHP一个主要的应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄链接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。
class single { private $name; // 声明一个私有的实例变量 private function __construct() // 声明私有构造方法 为了防止外部代码使用new来创建对象 { } static public $instance; // 声明一个静态变量(保证类中唯一的一个实例) static public function getinstance() // 声明一个静态方法,用于检测是否有实例对象 { if(!self::$instance) self::$instance = new self(); return self::$instance; } public function setname($n) { $this->name = $n; } public function getname() { return $this->name; } } $oa = Single::getinstance(); $ob = Single::getinstance(); $oa->setname(‘hello world‘); $ob->setname(‘good morning‘); echo $oa->getname(); echo $ob->getname();
注册模式
注册模式,解决全局共享和交换对象。已经创建好的对象,挂在某个全局可以直接使用的数组上,在需要使用的时候,直接在该数组上获取即可。
class Register { projected static $objects; function set($alias,$object) // 将对象注册到全局的树上 { self::$objects[$alias]=$object; } static function get($name) { return self::$object[$name]; // 获得某个注册到树上的对象 } function __unset($alias) { unset(self::$object[$alias]); // 移除某个注册到树上的对象 } }
适配器模式
将各种截然不同的函数接口封装成统一的API。
PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,是不同的数据库操作统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis等不同的缓存函数,统一成一致。
interface IDatabase { function connect($host,$user,$passwd,$dbnamne); function query($sql); function close(); } // MySQL class MySQL implements IDatabase { protected $conn; function connect($host,$user,$passwd,$dbname) { $conn = mysql_connect($host,$user,$passwd); mysql_select_db($dbname,$conn); $this->conn = $conn; } function query($sql) { $res = mysql_query($sql,$this->conn); return $res; } function close() { mysql_close($this->conn); } } class MySQLi implements IDatabase { protected $conn; function connect($host,$user,$passwd,$dbname) { $conn = mysqli_connect($host,$user,$passwd,$dbname); $this->conn = $conn; } function query($sql) { return mysqli_query($this->conn,$sql); } function close() { mysqli_close($this->conn); } }
观察者模式
1、观察者模式:当一个对象状态发生变化时,依赖它的对象全部会收到通知并自动更新。
2、场景:一个事件发生后,要执行一连串更新操作。传统的编程方式就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式时耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。
3、观察者模式实现了低耦合,非侵入式的通知和更新机制。
定义一个事件触发抽象类
EventGenerator.php <?php require_once ‘Loader.php‘; abstract class EventGenerator{ private $observers = array(); function addObserver(Observer $observer){ $this->observers[]=$observer; } function notify(){ foreach ($this->observers as $observer){ $observer->update(); } } } Observer.php <?php require_once ‘Loader.php‘; interface Observer{ function update();//这里就是在事件发生后要执行的逻辑 } //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件 require ‘Loader.php‘; class Event extends EventGenerator{ function triger(){ echo "Event<br>"; } } class Observer1 implements Observer{ function update(){ echo "逻辑1<br>"; } } class Observer2 implements Observer{ function update(){ echo "逻辑2<br>"; } } $event = new Event(); $event->addObserver(new Observer1()); $event->addObserver(new Observer2()); $event->triger(); $event->notify();
原文:https://www.cnblogs.com/wawjandcsws/p/10497651.html