1、单例模式指在整个应用中只有一个对象实例的设计模式

  1. class Single {
  2. public $rand;
  3. static private $instance; // 类直接调用
  4. final private function __construct() { // private防止外部new
  5. $this->rand = mt_rand(1, 100);
  6. }
  7. static public function getInstance() {
  8. if (!self::$instance) { // 判断$instance是否赋值
  9. self::$instance = new self;
  10. }
  11. return self::$instance;
  12. }
  13. }
  14. $obj1 = Single::getInstance();
  15. $obj2 = Single::getInstance();
  16. var_dump($obj1 === $obj2); // true

2、工厂模式指通过工厂类调用自身静态方法来生产对象实例的设计模式

  1. //接单例模式代码
  2. class FactoryClass {
  3. static public function factory() {
  4. return Single::getInstance();
  5. }
  6. }
  7. var_dump(FactoryClass::factory());

3、注册器模式指将对象注册到全局树上,可直接设置获取注销对象

  1. class Register {
  2. static protected $objects; //全局树array
  3. static public function set($alias, $object) {
  4. self::$objects[$alias] = $object; //设置
  5. }
  6. static public function get($alias) {
  7. return self::$objects[$alias]; //获取
  8. }
  9. static public function _unset($alias) {
  10. unset(self::$objects[$alias]); //注销
  11. }
  12. }
  13. Register::set('rand', FactoryClass::factory()); //设置别名为rand的对象
  14. var_dump(Register::get('rand')); //获取别名为rand的对象
  15. Register::_unset('rand'); //销毁别名为rand的对象
  16. var_dump(Register::get('rand')); //Notice: Undefined index: rand

 4、适配器模式指将一个类的接口转换成客户期望的另一个类的接口,让原本接口不兼容的类合作无间。

适配器分为类适配器和对象适配器,类适配器采用“多继承”的实现方式,导致不良的高耦合,对象适配器采用“对象组合”的方式,更符合松耦合精神。

  4.1 类适配器

  1. //类适配器使用的是继承
  2. /**
  3. * 目标
  4. */
  5. interface Target {
  6. public function method1(); //源类也有的方法1
  7. public function method2(); //源类没有的方法2
  8. }
  9.  
  10. /**
  11. * 源
  12. */
  13. class Source {
  14. public function method1() {
  15. echo '我是源类含有的方法一 <br>';
  16. }
  17. }
  18.  
  19. /**
  20. * 类适配器
  21. */
  22. class Adapter extends Source implements Target {
  23. public function method2() {
  24. echo '我是适配器补充的方法二 <br>';
  25. }
  26. }
  27.  
  28. /**
  29. * 客户端
  30. */
  31. class Client {
  32. static public function main() {
  33. $adapter = new Adapter();
  34. $adapter->method1();
  35. $adapter->method2();
  36. }
  37. }
  38. Client::main();

  4.2 对象适配器

  1. //类适配器使用的是继承
  2. /**
  3. * 目标
  4. */
  5. interface Target {
  6. public function method1(); //源类也有的方法1
  7. public function method2(); //源类没有的方法2
  8. }
  9.  
  10. /**
  11. * 源
  12. */
  13. class Source {
  14. public function method1() {
  15. echo '我是源类含有的方法一 <br>';
  16. }
  17. }
  18.  
  19. /**
  20. * 类适配器
  21. */
  22. class Adapter implements Target {
  23. private $_source;
  24. public function __construct(Source $source) {
  25. $this->_source = $source;
  26. }
  27. public function method1() { //委派调用source的method1方法
  28. $this->_source->method1();
  29. }
  30. public function method2() { //补充source中没有的method2方法
  31. echo '我是适配器补充的方法二';
  32. }
  33. }
  34. class Client {
  35. static public function main() {
  36. $adapter = new Adapter(new Source);
  37. $adapter->method1();
  38. $adapter->method2();
  39. }
  40. }
  41. Client::main();
  42. //我是源类含有的方法一
  43. //我是适配器补充的方法二

 5、观察者模式指当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

  1. /**
  2. * 主题接口
  3. */
  4. interface Subject {
  5. public function register(Observer $observer); //注册对象方法
  6. public function notify(); //通知方法
  7. }
  8. /**
  9. * 观察者接口
  10. */
  11. interface Observer {
  12. public function update();
  13. }
  14. /**
  15. * 执行类
  16. */
  17. class Action implements Subject {
  18. private $_observers = array();
  19. public function register(Observer $observer) {
  20. $this->_observers[] = $observer; //对象写入
  21. }
  22. public function notify() {
  23. foreach ($this->_observers as $observer) { //遍历对象
  24. $observer->update();
  25. }
  26. }
  27. }
  28. /**
  29. * 观察者
  30. */
  31. class Man implements Observer {
  32. public function update() {
  33. echo 'man观察者<br>';
  34. }
  35. }
  36. class Woman implements Observer {
  37. public function update() {
  38. echo 'woman观察者';
  39. }
  40. }
  41. $action = new Action();
  42. $action->register(new Man);
  43. $action->register(new Woman);
  44. $action->notify();

PHP常用设计模式的更多相关文章

  1. Android常用设计模式(二)

    Android常用设计模式之观察者模式 观察者设计模式在Android应用中会经常用到,模式原理类似于这样的场景: 用户订报纸,然后在报社登记,报社来统计用户(添加用户),用户也可以取消订阅,报社删除 ...

  2. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  3. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  4. python之路,Day24 常用设计模式学习

    python之路,Day24 常用设计模式学习   本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...

  5. java常用设计模式总览

    一.java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  6. javaEE Design Patter(1)初步了解23种常用设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...

  7. PHP 进阶篇:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 (麦子学员 第三阶段)

    以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式 ================================== ...

  8. C++源码实现:21种常用设计模式

    C++源码实现:21种常用设计模式一直以来在设计模式的学习中,都是出现java的源码,这对学习C++的极度不友好.本工程是基于C++实现21种常用的设计模式,里面包含了实例代码和示例.编写的时候在学习 ...

  9. 23种常用设计模式的UML类图

    23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...

  10. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

随机推荐

  1. Tensorflow中的变量

    从初识tf开始,变量这个名词就一直都很重要,因为深度模型往往所要获得的就是通过参数和函数对某一或某些具体事物的抽象表达.而那些未知的数据需要通过学习而获得,在学习的过程中它们不断变化着,最终收敛达到较 ...

  2. u_boot移植之内存基础知识DDR【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-4938411.html

  3. ASP.NET MVC3 Model的常用验证示例

    1.金额(10位整数,2位小数) #region 余额 /// <summary> /// 余额 /// </summary> [DisplayName("余额&qu ...

  4. 在IIS下部署SSL证书实现HTTPS

    在IIS下部署SSL证书实现HTTPS   HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.谷歌已经制定了一项长远的计划,它的最终目标是将所有通过HTTP协议呈现的网页标为“不安全” ...

  5. excel 2016 for mac破解

    1: 首先去官网下载一个正版的: 2:再下载一个破解工具: 链接: http://pan.baidu.com/s/1i4AFHFf 密码: 3yf8 3:最后按照破解教程破解: http://jing ...

  6. SURF 特征匹配

    参考:http://www.cnblogs.com/ronny/p/4045979.html,博主对源码进行了分析,不过很多没看明白. 分为几个部分.积分图:借助积分图像,图像与高斯二阶微分模板的滤波 ...

  7. 删除MySQL binlog日志的方法

    对于比较繁忙的OLTP(在线事务处理)系统,由于每天生成日志量大,这些日志如果长时间不清除,将会对磁盘空间带来很大的浪费.因此,定期删除日志是DBA维护MySQL数据库的一个重要工作内容.下面跟大家分 ...

  8. ***PHP $_FILES函数详解 + PHP文件上传 move_uploaded_file() 参数的正确写法

    PHP $_FILES函数详解 在PHP中上传一个文件建一个表单要比ASP中灵活得多.具体的看代码. 如:  复制代码代码如下: <form enctype="multipart/fo ...

  9. Linux系统运维笔记(三),设置IP和DNS

    Linux系统运维笔记(三),设置IP和DNS 手工配置静态的IP地址 也就是手工配置IP地址.子网掩码.网关和DNS. vi /etc/sysconfig/network-scripts/ifcfg ...

  10. #CSS margin-top父元素下落

    [我的解决方法] 给该父元素添加如下代码 border-top: 1px solid rgba(0,0,0,0); box-sizing:border-box; [原因] css2.1盒模型中规定的内 ...