设计模式
单例模式
- $_instance必须声明为静态的私有变量
- 构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义
- getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用
- ::操作符只能访问静态变量和静态函数
- new对象都会消耗内存
- 使用场景:最常用的地方是数据库连接。
- 使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。
- 私有的__clone()方法防止克隆对象
单例模式,使某个类的对象仅允许创建一个。构造函数private修饰,
申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。
1 <?php 2 3 /** 4 * Singleton class[单例模式] 5 * @author ITYangs<ityangs@163.com> 6 */ 7 final class Mysql 8 { 9 10 /** 11 * 12 * @var self[该属性用来保存实例] 13 */ 14 private static $instance; 15 16 /** 17 * 18 * @var mixed 19 */ 20 public $mix; 21 22 /** 23 * Return self instance[创建一个用来实例化对象的方法] 24 * 25 * @return self 26 */ 27 public static function getInstance() 28 { 29 if (! (self::$instance instanceof self)) { 30 self::$instance = new self(); 31 } 32 return self::$instance; 33 } 34 35 /** 36 * 构造函数为private,防止创建对象 37 */ 38 private function __construct() 39 {} 40 41 /** 42 * 防止对象被复制 43 */ 44 private function __clone() 45 { 46 trigger_error('Clone is not allowed !'); 47 } 48 } 49 50 // @test 51 $firstMysql = Mysql::getInstance(); 52 $secondMysql = Mysql::getInstance(); 53 54 $firstMysql->mix = 'ityangs_one'; 55 $secondMysql->mix = 'ityangs_two'; 56 57 print_r($firstMysql->mix); 58 // 输出: ityangs_two 59 print_r($secondMysql->mix); 60 // 输出: ityangs_two
Test1.php
1 <?php 2 class Test1{ 3 static function test(){ 4 echo __FILE__; 5 } 6 }
Factory.php
1 <?php 2 class Factory{ 3 /* 4 * 如果某个类在很多的文件中都new ClassName(),那么万一这个类的名字 5 * 发生变更或者参数发生变化,如果不使用工厂模式,就需要修改每一个PHP 6 * 代码,使用了工厂模式之后,只需要修改工厂类或者方法就可以了。 7 */ 8 static function createDatabase(){ 9 $test = new Test1(); 10 return $test; 11 } 12 }
Test.php
1 <?php 2 spl_autoload_register('autoload1'); 3 4 $test = Factory::createDatabase(); 5 $test->test(); 6 function autoload1($class){ 7 $dir = __DIR__; 8 $requireFile = $dir."\\".$class.".php"; 9 require $requireFile; 10 }
观察者模式
1:观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。
2:场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。
3:观察者模式实现了低耦合,非侵入式的通知与更新机制。
定义一个事件触发抽象类。
EventGenerator.php
1 <?php 2 require_once 'Loader.php'; 3 abstract class EventGenerator{ 4 private $observers = array(); 5 function addObserver(Observer $observer){ 6 $this->observers[]=$observer; 7 } 8 function notify(){ 9 foreach ($this->observers as $observer){ 10 $observer->update(); 11 } 12 } 13 }
定义一个观察者接口
Observer.php
1 <?php 2 require_once 'Loader.php'; 3 interface Observer{ 4 function update();//这里就是在事件发生后要执行的逻辑 5 }
//
1 <?php 2 //一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件 3 require 'Loader.php'; 4 class Event extends EventGenerator{ 5 function triger(){ 6 echo "Event<br>"; 7 } 8 } 9 class Observer1 implements Observer{ 10 function update(){ 11 echo "逻辑1<br>"; 12 } 13 } 14 class Observer2 implements Observer{ 15 function update(){ 16 echo "逻辑2<br>"; 17 } 18 } 19 $event = new Event(); 20 $event->addObserver(new Observer1()); 21 $event->addObserver(new Observer2()); 22 $event->triger(); 23 $event->notify();
AbstractFactory(抽象工厂模式)
有些情况下我们需要根据不同的选择逻辑提供不同的构造工厂,而对于多个工厂而言需要一个统一的抽象工厂:
1 <?php 2 class System{} 3 class Soft{} 4 5 class MacSystem extends System{} 6 class MacSoft extends Soft{} 7 8 class WinSystem extends System{} 9 class WinSoft extends Soft{} 10 11 /** * AbstractFactory class[抽象工厂模式] * @author ITYangs<ityangs@163.com> */ interface AbstractFactory { 12 public function CreateSystem(); 13 public function CreateSoft(); 14 } 15 16 class MacFactory implements AbstractFactory{ 17 public function CreateSystem(){ 18 return new MacSystem(); 19 } 20 public function CreateSoft(){ 21 return new MacSoft(); 22 } 23 } 24 class WinFactory implements AbstractFactory{ 25 public function CreateSystem(){ 26 return new WinSystem(); 27 } 28 public function CreateSoft(){ 29 return new WinSoft(); 30 } 31 } 32 //@test:创建工厂->用该工厂生产对应的对象 //创建MacFactory工厂 33 $MacFactory_obj = new MacFactory(); 34 //用MacFactory工厂分别创建不同对象 35 var_dump($MacFactory_obj->CreateSystem());//输出:object(MacSystem)#2 (0) { } var_dump($MacFactory_obj->CreateSoft());// 输出:object(MacSoft)#2 (0) { } 36 37 //创建WinFactory $WinFactory_obj = new WinFactory(); //用WinFactory工厂分别创建不同对象 38 var_dump($WinFactory_obj->CreateSystem());//输出:object(WinSystem)#3 (0) { } var_dump($WinFactory_obj->CreateSoft());//输出:object(WinSoft)#3 (0) { }
注册模式
注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。
1 <?php 2 3 class Register 4 { 5 protected static $objects; 6 function set($alias,$object)//将对象注册到全局的树上 7 { 8 self::$objects[$alias]=$object;//将对象放到树上 9 } 10 static function get($name){ 11 return self::$objects[$name];//获取某个注册到树上的对象 12 } 13 function _unset($alias) 14 { 15 unset(self::$objects[$alias]);//移除某个注册到树上的对象。 16 } 17 }