ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
在业务场景中经常遇到业务变动,如当前公司分别卖书狗酒,他们属性这些大不相同于是分别给他们创建了一个类,突然有一天卖酒的挂了,老板要求凡是关于酒的都返回会书的内容 这个时候,你不得不注释酒而实例实例化书,遇到命名空间你还的定位好久,而这种需求随时都会产生,像这种随时在某个节点创建不同实例时我们就可以使用工厂类统一管理类的实例化, ``` class Books { function getList() { return [ ["prod_id"=>101,"prod_name"=>"java从入门到住院"], ["prod_id"=>102,"prod_name"=>"php从精通到放弃"], ["prod_id"=>103,"prod_name"=>"黑客技术从入门到入狱"], ["prod_id"=>104,"prod_name"=>"python光速入门"], ["prod_id"=>105,"prod_name"=>"三小时学会golang"], ]; } } class Dogs { function getList() { return [ ["prod_id"=>201,"prod_name"=>"斑点"], ["prod_id"=>202,"prod_name"=>"泰迪"], ["prod_id"=>203,"prod_name"=>"二哈"], ["prod_id"=>204,"prod_name"=>"金毛"], ["prod_id"=>205,"prod_name"=>"杂交"], ]; } } class Wines implements IProduct { function getList() { return [ ["prod_id"=>301,"prod_name"=>"红酒"], ["prod_id"=>302,"prod_name"=>"白酒"], ["prod_id"=>303,"prod_name"=>"啤酒"], ["prod_id"=>304,"prod_name"=>"洋酒"], ["prod_id"=>305,"prod_name"=>"酒精"], ]; } } class ProductFactory { //商品工厂类 static function getProduct($type) { if($type=="Books") $type="Dogs";//变态需求产生 $obj=false; if(!class_exists($type)) { require($type.".php"); } switch($type) { case "Books": $obj=new Books(); break; case "Dogs": $obj=new Dogs(); break; case "Wines": $obj=new Wines(); break; } return $obj; } } ``` 工厂类只能返回一个类的实例,如果某一天老板要求返回全部类实例呢?这时我们就需要注册树模式,将这些类实例存入到一个属性中我们就叫他数据中心,Tp容器就是一个注册树模式与反射等综合而成的 这样我们取数据就从这个数据中心取,坚决不和类本身“私自交往” ``` interface IProduct { function getList(); } class Books implements IProduct { function getList() { return [ ["prod_id"=>101,"prod_name"=>"java从入门到住院"], ["prod_id"=>102,"prod_name"=>"php从精通到放弃"], ["prod_id"=>103,"prod_name"=>"黑客技术从入门到入狱"], ["prod_id"=>104,"prod_name"=>"python光速入门"], ["prod_id"=>105,"prod_name"=>"三小时学会golang"], ]; } } class Dogs implements IProduct { function getList() { return [ ["prod_id"=>201,"prod_name"=>"斑点"], ["prod_id"=>202,"prod_name"=>"泰迪"], ["prod_id"=>203,"prod_name"=>"二哈"], ["prod_id"=>204,"prod_name"=>"金毛"], ["prod_id"=>205,"prod_name"=>"杂交"], ]; } } class Wines implements IProduct { function getList() { return [ ["prod_id"=>301,"prod_name"=>"红酒"], ["prod_id"=>302,"prod_name"=>"白酒"], ["prod_id"=>303,"prod_name"=>"啤酒"], ["prod_id"=>304,"prod_name"=>"洋酒"], ["prod_id"=>305,"prod_name"=>"酒精"], ]; } } class ProductDataCenter { public static $objectList=[];//对象数组 ,保存 public static function set($k,$v) { self::$objectList[$k]=$v; } public static function remove($k) { unset(self::$objectList[$k]); } /* public static function get($k) { return self::$objectList[$k]; }*/ public static function __callStatic($name, $arguments) { // TODO: Implement __callStatic() method. $return=[];//默认返回值 foreach(self::$objectList as $k=>$v) { if(method_exists($v,$name)) { $ret=$v->$name($arguments); if($ret) { $return[]=$ret; } } } return $return; } } class ProductFactory { //商品工厂类 static function getProduct($type) { // if($type=="Books") $type="Dogs";//变态需求产生 $obj=false; if(!class_exists($type)) //这部分加载文件代码仅仅为了演示方便,请大家自行设置自动加载机制 { require($type.".php"); } switch($type) { case "Books": $obj=new Books(); break; case "Dogs": $obj=new Dogs(); break; case "Wines": $obj=new Wines(); break; } if(is_subclass_of($obj,"IProduct")) ProductDataCenter::set($type,$obj);//把创建的对象塞入数据中心 } } ``` 如果在取出全部实例的情况下,还要单独取出指定的实例呢? 这时我们就需要一个模板方法 用于返回数据,当然业务实体太复杂我们就需要单独建一个实体类,但这里没必要 ``` <?php interface IProduct { function getList(); } class Books implements IProduct { function getList() { return [ ["prod_id"=>101,"prod_name"=>"java从入门到住院"], ["prod_id"=>102,"prod_name"=>"php从精通到放弃"], ["prod_id"=>103,"prod_name"=>"黑客技术从入门到入狱"], ["prod_id"=>104,"prod_name"=>"python光速入门"], ["prod_id"=>105,"prod_name"=>"三小时学会golang"], ]; } public function getChild($param){ $anonymous_class=new class($param[0]){ // 匿名类的参数将直接传递给匿名类的析构函数 function __construct($param){ //$sql="select * form product where id={$param}"; $arr=["prod_id"=>101,"prod_name"=>"java从入门到住院"];//这里模拟id未101的数据 foreach ($arr as $key => $value) { $this->$key=$value; } } }; return $anonymous_class; } } class Dogs implements IProduct { function getList() { return [ ["prod_id"=>201,"prod_name"=>"斑点"], ["prod_id"=>202,"prod_name"=>"泰迪"], ["prod_id"=>203,"prod_name"=>"二哈"], ["prod_id"=>204,"prod_name"=>"金毛"], ["prod_id"=>205,"prod_name"=>"杂交"], ]; } public function getChild($param){ $anonymous_class=new class($param[0]){ // 匿名类的参数将直接传递给匿名类的析构函数 function __construct($param){ //$sql="select * form product where id={$param}"; $arr=["prod_id"=>201,"prod_name"=>"斑点"];//这里模拟id未201的数据 foreach ($arr as $key => $value) { $this->$key=$value; } } }; return $anonymous_class; } } class Wines implements IProduct { function getList() { return [ ["prod_id"=>301,"prod_name"=>"红酒"], ["prod_id"=>302,"prod_name"=>"白酒"], ["prod_id"=>303,"prod_name"=>"啤酒"], ["prod_id"=>304,"prod_name"=>"洋酒"], ["prod_id"=>305,"prod_name"=>"酒精"], ]; } public function getChild($param){ $anonymous_class=new class($param[0]){ // 匿名类的参数将直接传递给匿名类的析构函数 function __construct($param){ //$sql="select * form product where id={$param}"; $arr=["prod_id"=>301,"prod_name"=>"红酒"];//这里模拟id未301的数据 foreach ($arr as $key => $value) { $this->$key=$value; } } }; return $anonymous_class; } } class ProductDataCenter { public static $objectList=[];//对象数组 ,保存 public static function set($k,$v) { self::$objectList[$k]=$v; } public static function remove($k) { unset(self::$objectList[$k]); } /* public static function get($k) { return self::$objectList[$k]; }*/ public static function __callStatic($name, $arguments) { $return=[];//默认返回值 foreach(self::$objectList as $k=>$v) { if(method_exists($v,$name)) { $ret=$v->$name($arguments); if($ret) { $return[]=$ret; } } } return $return; } } class ProductFactory { //商品工厂类 static function getProduct($type) { if(is_string($type)) { self::getObjectByType($type); } else if(is_array($type)) // 加入对数组参数的支持 { foreach($type as $t) self::getObjectByType($t); } } //商品工厂类 static function getObjectByType($type) { $obj=false; switch($type) { case "Books": $obj=new Books(); break; case "Dogs": $obj=new Dogs(); break; case "Wines": $obj=new Wines(); break; } if(is_subclass_of($obj,"IProduct")) ProductDataCenter::set($type,$obj);//把创建的对象塞入数据中心 } } ProductFactory::getObjectByType('Dogs'); ProductFactory::getObjectByType('Books'); ProductFactory::getObjectByType('Wines'); // ProductFactory::getProduct(['Dogs', 'Books', 'Wines']); $dogs=ProductDataCenter::getList();//Dogs/Books/Wines这三个类实例 // var_dump($dogs); $dogs=ProductDataCenter::getChild(201);//单个 var_dump($dogs); ``` 我们在取出指定的实例时往往还需要取出其他数据比如该商品当日点击量,用户对该商品的浏览记录,设置一些系统日志等呢? 全部写在一个方法里?玩意哪天不要了呢,或者图书要某些功能而狗不需要呢?