PHP设计模式、工厂模式讲解
工厂模式
工厂方法或类生成对象,而不是直接在代码中new
单例模式
使某个类仅创建一次,防止数据库的连接多次,造成资源浪费
声明非公开的成员属性,用户判断
构造方法私有化
声明静态的公有方法,来实例对象
protected $db
private function __construct(){}
static function getInstace(){
if(self::$db){
return self::$db;
}else{
self::db=new self;
return self::db;
}
}
注册树模式
将实例化的对象存储在树上(即一个数组变量),每次使用必须在使用单例模式判断,直接调取注册树中存储的对象即可
class Register{
protect static $objects;
static function set($alias,$object){
self::$objects[$alias]=$object;
}
static function get($alias){
return self::$object[$alias];
}
function __unset(){
unset(self:$object[$alias]);
}
}
适配器模式
可以将截然不同的函数接口封装称统一的api
实际应用举例:php的数据库三种操作封装,cache适配器
建立一个接口类,让这些不同的全部继承接口类去实现具体的方法
interface IDatabase{
function connect($host,$user,$passed,$dbname)
function query($sql);
function close();
}
class Mysqli implements IDatabase{
protected $conn;
function connect($host,$user,$passed,$dbname){
$conn=mysqli_connect($host,$user,$passed,$dbname);
$this->conn=$conn;
}
function query($sql){
return mysqli_query($this->conn,$sql);
}
function close(){
mysqli_close($this->conn);
}
}
new 命名空间/类名 调用
这里可以直接写一个工厂方法实例化,这样就只需要传参数就行了
策略模式
PHP策略模式
UserStateagy.php策略的接口文件:约定策略的所有行为
FemaleUserStrategy.php实现接口的所有方法
MaleUserStragy.php实现接口的所有方法
调用
class Page{
protected $strategy;
function index(){
echo “AD”;
$this->strategy->showAd();
echo “
”;
echo “Category”;
$this->straregy->showCategory()
}
function setStrategy(\IMooc\UserStrategy $strategy){
$this->strategy=$srategy;
}
}
$page=new Page();
if(isset($_GET[‘female’])){
$strategy=new?
}else{
$strategy=new?
}
$page->setStrategy($strategy);(以策略对象为参数进行策略传递)
$page->index();
数据对象映射模式
数据映射对象模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作
生成一个数据对象操作表的类,使用的时候,直接new会乱,所以就使用工厂方法,但是工厂方法创建了两个对象,所以就使用注册器模式把对象注入,就只使用一个了。
观察者模式
事件产生者
EventGenerator.php
abstract class EventGenerator{
private $observer=array();
function addObserver(Oberver $observer){
$this->observers[]=$observer;
}
function notify(){
foreach($this->observers as $observer){
$observer->update();
}
}
}
观察者接口
interface Observer{
function update();
}
执行
class Event extends EventGenrator{
function trigger(){
echo “event”;
$this->notify()
}
}
class Observer1 implements Observer{
function update(){
echo “逻辑一”;
}
}
$event=new Event;
$event->addObserver(new Observer1);
$event->trigger();
原型模式:通过clone来在内存拷贝大对象,节约开销
原型模式与工厂模式作用类似,用来创建对象,先创建好一个原型对象,然后通过clone原型对象来创建新的对象,就免去了类创建时重复的初始化操作,原型模式仅适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new都会消耗很大,原型模式仅需内存拷贝即可
装饰器模式 可以动态的添加修改类的功能,一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个字类继承它,并重新实现类的方法,使用装饰器模式,仅需在运行时添加个装饰器对象即可实现,可以实现最大的灵活性
迭代器模式?
在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素,相比传统的编程模式,迭代器模式可以隐藏遍历元素的操作
接口Iterator
current()返回当前元素
key()返回当前元素的键
next()向前移动到下一个元素
rewind()返回到迭代器的第一个元素
valid()检查当前位置是否有效
代理模式
数据库的读写分离
分离读操作和写操作的时候,设置个代理,里面实现获取和更新操作,然后直接实例化调用相关方法
class Proxy implements IUserProxy{
function getUserName($id){
$db=Factory::getDatabase(slave)
}
function setUserName($id,$name){
Factory::getDatabase(’master’)
}
}