怎么在php中实现工厂方法模式

  介绍

怎么在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→美元才能攻击();   ?祝辞

<强>用途总结:强工厂方法模式将新建对象的任务将给对应的具体工厂类,不必因为某些生产的对象需要进行额外处理而修改对外的主工厂。

<强>实现总结:

怎么在php中实现工厂方法模式