最近没事就看看设计模式,先把主要的模式列表列出来,然后逐个详细说说。
常用设计模式
单例模式
确保一个类只有一个实例, 而且自行实例化,并向整个系统提供这个实例。
优点
- 由于只有一个实例减少了内存的开销
- 由于只实例化一次,在创建的对象需要读取配置,获取其他依赖对像时,能减少性能的开销
- 避免文件多重占用,例如文件的写操作
- 优化和共享资源的访问
缺点
- 单例模式一般没有接口,扩展只能通过修改源代码
- 与单一职责原则相冲突
- 对测试不利, 单例不写好,无法测试
场景
- 创建对象的消耗太大,比如对象中存在了大量的常量
- 对象在整个程序的运行过程中并不会发生改变
例如,我们常用的数据库连接基本都是单例模式,因为创建的连接对象是一致的,并不会发生改变,此时,如果不使用单例模式,创建过多的对象,只会带来性能开销。
代码实现
<?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');