首頁  >  文章  >  後端開發  >  php物件導向開發之-工廠模式

php物件導向開發之-工廠模式

黄舟
黄舟原創
2016-12-29 11:09:531580瀏覽

工廠模式通俗來說是指,為一些有著相同結構的類別創建一個類族,並且為這個族群提供唯一一個入口類。請注意「相同結構」這個描述,它指的是某類物體擁有一些能讓我們區別與其他物體的特徵,比如說現在有一道聯想題,透過兩個字聯想一樣東西。 「四個輪子,燒汽油」。我想你一定能立刻聯想到小轎車、廂型車、的士之類的車,不會聯想到摩托車。這裡的「四個輪子」和「燒汽油」便是小轎車、麵包車、的士的相同特徵,我們以它們來將小轎車、麵包車和的士歸類為「汽車」這個族群。

回到php當中,這裡將以實例來說明工廠模式。

現在有一個汽車工廠,它生產小汽車和巴士車,小汽車和巴士車都是由引擎、車身和輪子組成的。

分析:

1、生產各種汽車有共同的標準,都必須生產引擎、車身和輪子,於是我們可以為生產汽車制定一個接口類,各類汽車都必須遵循這個接口類中的標準。

2、外界需要提供工廠生產小型汽車和巴士車的入口。

//生产汽车的标准  
    interface carNorms{  
        function engine();//引擎  
        function body();//车身  
        function whell();//轮子  
    }  
      
    //生产小汽车  
    class car implements carNorms{  
          
        public function engine(){  
            return '汽车引擎';  
        }  
          
        public function body(){  
            return '汽车车身';  
        }  
          
        public function whell(){  
            return '汽车轮子';  
        }  
          
    }  
      
    //生产巴士车  
    class bus implements carNorms{  
          
        public function engine(){  
            return '巴士引擎';  
        }  
          
        public function body(){  
            return '巴士车身';  
        }  
          
        public function whell(){  
            return '巴士轮子';  
        }  
          
    }  
      
    //汽车工厂  
    class carFactory{  
          
        static public function carInstance($type){  
            $instance='';  
            switch($type){  
                case 'car':  
                    $instance=new car();  
                    break;  
                case 'bus':  
                    $instance=new bus();  
                    break;  
                default:  
                    throw new Exception('本工厂无法生产这种类型的车');  
            }  
            if(!$instance instanceof carNorms){  
                throw new Exception('这种车不符合生产标准');  
            }  
            return $instance;  
        }  
          
    }  
      
    $createCar=carFactory::carInstance('car');  
    $car['engine']=$createCar->engine();  
    $car['body']=$createCar->body();  
    $car['whell']=$createCar->whell();  
      
    print_r($car);

這是一個標準的工廠類,現在新的需求來了,工廠還需要生產卡車。

分析:由於生產卡車也符合該工廠的生產標準,我們可以直接加入卡車類,並在工廠類中增加相應的入口。

class truck implements carNorms{  
          
        public function engine(){  
            return '卡车引擎';  
        }  
          
        public function body(){  
            return '卡车车身';  
        }  
          
        public function whell(){  
            return '卡车轮子';  
        }  
          
    }
//汽车工厂    
    class carFactory{    
            
        static public function carInstance($type){    
            $instance='';    
            switch($type){    
                case 'car':    
                    $instance=new car();    
                    break;    
                case 'bus':    
                    $instance=new bus();    
                    break;    
                case 'truck':    
                    $instance=new truck();    
                    break;    
                default:    
                    throw new Exception('本工厂无法生产这种类型的车');    
            }    
            if(!$instance instanceof carNorms){    
                throw new Exception('这种车不符合生产标准');    
            }    
            return $instance;    
        }    
            
    }

很輕鬆的完成了,但是我們在這假設一下,如果生產標準變了,生產環節還需要加入品質檢測,我們要完成這個更改,必須在介面中加入品質測試方法。

//生产汽车的标准  
    interface carNorms{  
        function engine();//引擎  
        function body();//车身  
        function whell();//轮子  
        function check();//质量测试  
    }

麻煩的是,工廠生產的所有汽車都必須加入品質檢測方法,在該工廠中,只生產三種汽車,似乎不是很麻煩。但我們再想一想,若是一個工廠有成千上萬種產品,增加一個標準將要給每一種產品都添加進這種標準,將產生多大的成本開銷!這就是工廠方法的不足之處,使用工廠模式一定要注意!

 以上就是php物件導向開發之-工廠模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn