1.单例模式
a.含义: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次。
b.使用场景
1.例如数据库实例,一般都会走单例模式。
2.单例模式可以减少类的实例化
c.代码示例
<?php
class DB{
public static $instance =null;
public static function instance(){
$class = get_called_class();
if(empty(self::$instance[$class])){
self:$instance[$class] = new $class();
}
return self:$instance[$class];
}
}
2.观察者模式
a.含义:观察者设计模式能够更便利创建和查看目标对象状态的对象,并且提供和核心对象非耦合的置顶功能性。观察者设计模式非常常用,在一般复杂的WEB系统中,
观察者模式可以帮你减轻代码设计的压力,降低代码耦合。
b.使用场景:
1.设计一个订单类
2.订单创建完成后,会做各种动作,比如发送EMAIL,或者改变订单状态等等。
3.原始的方法,是将这些操作都写在create函数里面
4.但是随着订单创建类的越来越庞大,这样的操作已经无法满足需求和快速变动
5.这个时候,观察者模式出现了。
c.代码示例:
<?php
header("Content-type:text/html;charset=UTF-8");
class order{
protected $observers = array();
//增加观察者
public function addObserver($type,$observer){
$this->observers[$type][] = $observer;
}
//运行观察者
public function obServer($type){
if(isset($this->observers[$type])){
foreach ($this->observers[$type] as $key => $obser) {
$a = new $obser;
$a->update($this);
}
}
}
//下单购买流程
public function create(){
echo '购买成功<br>';
$this->obServer('buy');
}
}
class orderEmail{
public function update($order){
echo "发送购买成功的一个邮件<br>";
}
}
class orderStatus{
public function update($order){
echo "改变订单状态<br>";
}
}
$ob= new order();
$ob->addObserver('buy','orderEmail');
$ob->addObserver('buy','orderStatus');
$ob->create();
3.工厂模式
a.提供获取某个对象实例的一个接口,同时使调用代码避免确定实例化基类的步骤。
工厂模式 实际上就是建立一个统一的类实例化的函数接口。统一调用,统一控制。
工厂模式是php项目开发中,最常用的设计模式,一般会配合单例模式一起使用,来加载php类库中的类。
b.应用场景
1.我们拥有一个Json类,String类,Xml类。
2.如果我们不使用工厂方式实例化这些类,则需要每一个类都需要new一遍,过程不可控,类多了,到处都是new的身影
3.引进工厂模式,通过工厂统一创建对象实例。
c.代码示例
<?php
class factory{
public static function create($class){
return new $class;
}
}
class string{
public function write(){}
}
class json{
public function getJsonData(){}
}
class xml{
public function buildXml(){}
}
var_dump(factory::create('string'));
4.策略模式
a.含义:策略模式设计帮助构建的对象不必自身包含逻辑,而是能够根据需要利用其他对象中的算法
b.应用场景:
1.例如有一个CD类,我们类存储了CD的信息。
2.原先的时候,我们在CD类中直接调用getCD方法给出XML的结果
3.随着业务扩展,需求方提出需要JSON数据格式输出
4.这个时候我们引进了策略模式,可以让使用方根据需求自由选择是输出XML还是JSON
c.代码示例
<?php
class cd{
protected $cdArr;
public function __construct($title,$info){
$this->cdArr['title'] = $title;
$this->cdArr['info'] = $info;
}
public function getCd($typeObj){
return $typeObj->get($this->cdArr);
}
}
class json{
public function get($return_data){
return json_encode($return_data);
}
}
class xml{
public function get($return_data){
$xml='<?xml version="1.0" encoding="utf-8" ?>';
$xml.='<return>';
$xml.='<data>'.serialize($return_data).'</data>';
$xml.='</return>';
return $xml;
}
}
$cd = new cd('cd_1','cd_1');
echo $cd->getCd(new json)."<br>";
echo $cd->getCd(new xml)."<br>";