设计模式的理解

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

常用设计模式

单例模式

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

优点

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

缺点

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

场景

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

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

代码实现

<?php
/**
 * Created by PhpStorm.
 * User: winlans
 * Date: 12/30/17
 * Time: 10:49 PM
 */

class  MySQL {
    private $dbname = 'test';
    private $host = '127.0.0.1';
    private $user = 'root';
    private $passwd = '';
    private $connect;
    private static $singleton;

    private function __construct()
    {
        $this->connect = new PDO(sprintf('mysql:dbname=%s;host=%s', $this->dbname,$this->host),
            $this->user, $this->passwd);
    }

    public static function getSingleton(){
        if ( !self::$singleton instanceof self) {
            self::$singleton = new self();
        }
        return self::$singleton;
    }

    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    public function query($sql){
        $statement = $this->connect->query($sql);
        return $statement->fetchAll();
    }
}

$mysql = MySQL::getSingleton();
$result = $mysql->query('select * from student');

组合模式

责任链模式

门面模式

策略模式

观察者模式

装饰模式

适配器模式

工厂方法模式

进阶模式

抽象工厂模式

模板方法模式

代理模式

建造者模式

原型模式

中介者模式

命令模式

迭代器模式

备忘录模式

访问者模式

状态模式

解释器模式

享元模式

桥梁模式


新模式

规格模式

对象池模式

雇工模式

黑板模式

空对象模式