介绍
怎么在php中实现工厂方法模式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>待解决的问题强>:虽然简单工厂解决了动态返回不同类型对象的问题,但是实际情况当中,往往在新建一个对象的时候,需要做一些额外处理,比如制造机枪兵的时候需要判断水晶矿是否大于50岁而制造火焰兵的时候需要同时判断水晶矿是否大于50和气矿大于25日还有是否建造了研究院。如果把这些代码全部放到工厂制造类里面,会使得制造类很臃肿,而且随着工厂生产的对象的种类越来越多,工厂制造类的代码会越来越难以维护。
<强>思路强>:简单工厂模式中的工厂类(兵种制造器的类)保持不变,增加一个制造接口,定义一个实际制造对象的方法,然后定义各个具体制造不同对象的工厂,同时要求这些工厂执行这个制造接口,让这些工厂去实现实际制造对象的方法。
<强>工厂方法模式示例:强>
我们把机枪兵类和制造机枪兵的类的代码放入一个文件,海洋。php,它的代码如下:
& lt; php ?//机才能枪兵类 ,class 海洋 {才能 ,,,//机枪兵攻击的方法 ,,,public function 攻击() ,,,{ ,,,,,echo & # 39; Marine 攻击# 39;; ,,,} ,,}//制才能造机枪兵的类,执行接口abstractCreator class 才能;MarineCreator  implements abstractCreator {才能 ,,,//实际制造机枪兵的方法 ,,,public function realCreate () ,,,{ ,,,,,//如果水晶矿大于50,这里只是作为说明,因为并不存在矿石这个变量,也不考虑水晶少于50的处理 ,,,,,如果(ore>美元;50) ,,,,,{ ,,,,,,,return new 海洋(); ,,,,,} ,,,} ,,} 祝辞;
我们把火焰兵类和制造火焰兵的类的代码放入一个文件,Firebat。php,它的代码如下:
& lt; php ?//才能火焰兵类 class Firebat才能 {才能 ,,,//火焰兵攻击的方法 ,,,public function 攻击() ,,,{ ,,,,,echo & # 39; Firebat 攻击# 39;; ,,,} ,,}//制才能造火焰兵的类,执行接口abstractCreator class 才能;FirebatCreator  implements abstractCreator {才能 ,,,//实际制造火焰兵的方法 ,,,public function realCreate () ,,,{ ,,,,,//如果水晶矿大于50同时气矿大于25日,并且研究院已经存在。这里只是作为说明,因为并不存在矿石和气体和学院变量,也不考虑资源不够时的处理 ,,,,,如果(ore>美元;50,,,,gas>美元;25岁,,,,Academy> 1) ,,,,,{ ,,,,,,,return new Firebat (); ,,,,,} ,,,} ,,} 祝辞;
主文件中的内容如下:
& lt; php ?//各才能个具体工厂必须执行的接口 interface abstractCreator才能 {才能 ,,,//规定各个具体工厂要实现的方法 ,,,public function realCreate (); ,,}//兵才能种制造器的类,也就是主工厂 class BarracksCreator才能 {才能 ,,,//制造兵种的方法 ,,,public 创建(createWhat美元) ,,,{ ,,,,,//根据输入的参数,动态的把需要的类的定义文件载入 ,,,,,require_once(本市createWhat # 39;美元。php # 39;); ,,,,,//根据输入的参数,动态的获取相应的具体工厂的类的名字 ,,,,,creatorClassName 美元;=,美元createWhat # 39;公司创建者# 39;; ,,,,,//新建具体工厂对象 ,,,,,creator 美元;=,new creatorClassName美元; ,,,,,//用具体工厂来实际生产,然后返回需要的类的对象。因为它们都执行了接口abstractCreator,所以肯定实现了方法realCreate () ,,,,,return 美元创造者→realCreate (); ,,,} ,,}//新才能建一个兵种制造器对象 时间=美元才能creator new BarracksCreator ();//才能靠接收参数制造一个火焰兵对象=美元才能troop1 美元创造者→创建(& # 39;海洋# 39;); troop1→美元才能攻击();//才能靠接收参数制造一个机枪兵对象=美元才能troop2 美元创造者→创建(& # 39;Firebat& # 39;); troop2→美元才能攻击(); ?祝辞
<强>用途总结:>强工厂方法模式将新建对象的任务将给对应的具体工厂类,不必因为某些生产的对象需要进行额外处理而修改对外的主工厂。
<强>实现总结: