最近没事就看看设计模式,先把主要的模式列表列出来,然后逐个详细说说。

常用设计模式

单例模式

确保一个类只有一个实例, 而且自行实例化,并向整个系统提供这个实例。

优点

  • 由于只有一个实例减少了内存的开销
  • 由于只实例化一次,在创建的对象需要读取配置,获取其他依赖对像时,能减少性能的开销
  • 避免文件多重占用,例如文件的写操作
  • 优化和共享资源的访问

缺点

  • 单例模式一般没有接口,扩展只能通过修改源代码
  • 与单一职责原则相冲突
  • 对测试不利, 单例不写好,无法测试

场景

  • 创建对象的消耗太大,比如对象中存在了大量的常量
  • 对象在整个程序的运行过程中并不会发生改变

    例如,我们常用的数据库连接基本都是单例模式,因为创建的连接对象是一致的,并不会发生改变,此时,如果不使用单例模式,创建过多的对象,只会带来性能开销。

代码实现

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: winlans
  5. * Date: 12/30/17
  6. * Time: 10:49 PM
  7. */
  8. class MySQL {
  9. private $dbname = 'test';
  10. private $host = '127.0.0.1';
  11. private $user = 'root';
  12. private $passwd = '';
  13. private $connect;
  14. private static $singleton;
  15. private function __construct()
  16. {
  17. $this->connect = new PDO(sprintf('mysql:dbname=%s;host=%s', $this->dbname,$this->host),
  18. $this->user, $this->passwd);
  19. }
  20. public static function getSingleton(){
  21. if ( !self::$singleton instanceof self) {
  22. self::$singleton = new self();
  23. }
  24. return self::$singleton;
  25. }
  26. private function __clone()
  27. {
  28. // TODO: Implement __clone() method.
  29. }
  30. public function query($sql){
  31. $statement = $this->connect->query($sql);
  32. return $statement->fetchAll();
  33. }
  34. }
  35. $mysql = MySQL::getSingleton();
  36. $result = $mysql->query('select * from student');

组合模式

责任链模式

门面模式

策略模式

观察者模式

装饰模式

适配器模式

工厂方法模式

进阶模式

抽象工厂模式

模板方法模式

代理模式

建造者模式

原型模式

中介者模式

命令模式

迭代器模式

备忘录模式

访问者模式

状态模式

解释器模式

享元模式

桥梁模式


新模式

规格模式

对象池模式

雇工模式

黑板模式

空对象模式