所谓设计模式 简单来说就是为了解决特定业务问题而提供的解决方案 php由于其本身的特点主要使用两种设计模式 一种是单例模式一种是工厂模式
如果一个类只允许实例化一个对象 比如资源管理器 如果会实例化多个对象 不符合逻辑 这种情况就会使用到单例模式
<?php
/*
* 实现 单例模式 一个类只能实例化一个对象
*/
class singleton{
//把构造函数私有化 这样外部就不可以实例化对象
// 给函数一个属性用来存储实例化对象 然后每次调用getInstance都判断一下是否有对象
private static $instance = null;//外部只能得到他 不能操作
private function __construct(){
}
//目前外部连一个对象都不能实例化 不符合业务需求
//提供一个实例化对象的入口 因为无法实例化 所以必须是静态的
public static function __getInstance(){
if((!self::$instance instanceof self)){
#对象不存在
self::$instance = new self();
}
return self::$instance;
}
#为了避免通过clone克隆函数 把clone方法私有
private function __clone(){
}
}/*
$s3 = new singleton();
var_dump($s3);报错*/
$s1 = singleton::__getInstance();
$s2 = singleton::__getInstance();
var_dump($s1,$s2);//object(singleton)#1(0){} object(singleton)#1(0){}说明只产生了一个 对象
/*$s3 = clone $s1;
var_dump($s3);报错*/
?>
总结单例模式 就是三私一共 私有化构造方法 让外部无法通过new 实例化对象 私有化属性object 让外部无法对存储对象的属性进行操作 私有化clone克隆函数 让外部无法通过clone克隆出一样的对象 公开getInstance方法 给外部一个实例化对象的入口 静态方法 只能通过类调用 调用之后先判断类静态属性instance 是否是类对象 利用instance结构 如果不是 在方法内部通过new实例化对象并且赋值给类属性instance 如果已经是类对象了 直接返回类属性就好
如果一个工具类被实例化了很多次 那么当类名改变时 后面实例化都要改变 维护成本太大 所以就有了工厂模式 工厂模式为类提供了一个生产对象的流水线 所有想要实例化的操作都调用工厂类和对应 方法 后期维护也只要维护工厂和流水线方法节即可
<?php
/*
* 实现工厂模式、
* 先提供三个类
*/
class Man{
public function display(){
echo "男人";
}
}
class Woman{
public function display(){
echo "女人";
}
}
class LadyBody{
public function display(){
echo "人妖";
}
}
#工厂类
class HumanFactory{
public static function getInstance($flot){ //$flot 代表标记
switch($flot){
case 'm' : return new Man();
case 'w' : return new Woman();
case 'l' : return new LadyBody();
default : return null;
}
}
}
$m = HumanFactory::getInstance('m'); //需要记得标记
$w = HumanFactory::getInstance('w');
$l = HumanFactory::getInstance('l');
$m->display();
$w->display();
$l->display();
?>
如图以后如果woman类需要修改成girl类 只需要修改工厂流水线方法中一个new woman();就好
单例模式解决一个类只允许出现一个实例化对象的问题 工厂模式提供相似类的流水化实例 便于以后维护