单例模式 (确保一个类只实例化一次并且可以自行实例化)
工厂模式 (替代了new操作)
策略模式 (使用不同的方法来达到同样的目的)
观察者模式 (一个对象发生变化时其他对象也会触发相应的操作)
适配器模式 (把不同的方法封装成统一的方法)
注册模式 (把实例放进一个数组以供调用)
这些设计模式在常见的php框架:ThinkPHP, Yii2等都有用到.
/*
* 单例模式
* 确保此类只有一个实例并可以自行实例化
* 用在: 数据库操作, 日志对象 等.
*/class single{ public $db = NULL; static $instance = null; public function __construct() {
$this->db = new mysqli('127.0.0.1', 'root', 'root', 'test'); if($this->db->connect_error){ die('connect error:' . $this->db->connect_error);
} echo "mysql connect successful\n";
} static public function getInstance(){ if(!(self::$instance instanceof self)){ self::$instance = new self(); echo "aaa\n";
} echo "bbb\n"; return self::$instance;
} public function __destruct() {
$this->db->close();
}
}
single::getInstance();
single::getInstance();//输出:/*
mysql connect successful
aaa
bbb
bbb
*//**
* 工厂模式
* 用工厂方法代替new操作的一种模式
*/interface people{ public function say();
}class man implements people{ public function say() { echo "i am man \n";
}
}class woman implements people{ public function say() { echo "i am woman \n";
}
}class factory{ public function createMan(){ return new man();
} public function createWoman(){ return new woman();
}
}
$f = new factory();
$f->createMan()->say();
$f->createWoman()->say();//输出/*
i am man
i am woman
*//**
* 策略模式 [使用不同的方式达到同一个目的]
* 场景:乘坐不同交通工具去公司上班
*/abstract class tools{ abstract function working();
}class bicyle extends tools{ public function working() { echo __METHOD__ . "\n";
}
}class car extends tools{ public function working() { echo __METHOD__ . "\n";
}
}class transport{ public function running($obj){
$obj->working();
} /**
* 使用魔术方法也可以达到上述效果
* @param type $name
* @param type $arguments
*/
public function __call($name, $arguments) {
$arguments[0]->$name();
}
}
$t = new transport();
$t->running(new car());
$t->running(new bicyle());
$t->working(new car());//使用魔术方法也可以达到上述效果//输出/*
car::working
bicyle::working
car::working
*//*
* 观察者模式
* 当一个对象状态发生变化时,依赖它的对象全部收到触发操作
* 发生场景:yii2的behavior,event
*/interface event{ function run();
}class e1 implements event{ public function run() { echo __METHOD__ . "\n";
}
}class e2 implements event{ public function run() { echo __METHOD__ . "\n";
}
}class observer{ static $obs;
function addObs($name, $obj){ self::$obs[$name] = $obj;
} function trigger(){ foreach (self::$obs as $val){
$val->run();
}
}
}
$o = new observer();
$o->addObs('e1', new e1());
$o->addObs('e2', new e2());
$o->trigger();//输出/*
e1::run
e2::run
*//*
* 适配器模式
* 把不同的方法封装成统一的方法以供调用
* 用在 数据库 mysql, mysqli, pdo 等
*/interface db{ public function connect(); public function query(); public function close();
}class mysqlA implements db{ public $db;
public function connect(){
$this->db = mysqli_connect($host, $user, $password, $database, $port, $socket);
} public function query(){
} public function close(){
mysqli_close($this->db);
}
}class mysqlB implements db{ public $db;
public function connect() {
$this->db = new PDO($dsn, $username, $password);
}
public function query(){
}
public function close(){
$this->db = null;
}
}/*
* 注册模式
* 把已有对象放入一个数组里以供调用
*/class register{ static $objects;
public static function set($name, $obj){ self::$objects[$name] = $obj;
} public static function get($name){ return self::$objects[$name];
}
}class log{};
register::set('log', new log());
$log = register::get('log');原文出处:https://www.cnblogs.com/kaykay012/p/9599355.html