php的設計模式------工廠模式
阿新 • • 發佈:2017-12-04
getc 設計模式 gets shu 延遲 echo 方法 product blue
1.工廠模式簡介
屬於創建型模式。定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類,工廠模式使其創建過程延遲到子類進行
主要解決的問題:接口選擇的問題。
2.分類
2.1 簡單工廠模式
接口:interface 具體:class 工廠:factory
// 1 創建一個接口 interface Shape{ const NAME = ‘vic‘; public function draw(); } // 2.實體類 class Rectangle implements Shape{ public function draw(){ echo ‘Rectangle‘; } }class Square implements Shape{ public function draw(){ echo ‘Square‘; } } class Circle implements Shape{ public function draw(){ echo ‘Circle‘; } } // 新的圖形,可以在此創建類,擴展
// 3.創建工廠 class ShapeFactory { public static function getShape( string $shapeType){ if( empty($shapeType) ){ return ; } switch( strtolower($shapeType) ){ case ‘rectangle‘: return new Rectangle(); break; case ‘Square‘: return new Square(); break; case ‘circle‘: returnnew Circle(); break; //如果有其他圖形,可以擴展 } return ; } } $shape = shapeFactory::getShape(‘Rectangle‘); $shape->draw();
2.2抽象工廠模式
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類
接口:interface 實體:class 抽象工廠:interface Factory 工廠實體:class Factory 創建工廠: factory
// 1 創建一個接口 interface Shape{ const NAME = ‘vic‘; public function draw(); } // 1.2 顏色接口 interface Color{ function fill(); } // 2.實體類 class Rectangle implements Shape{ public function draw(){ echo ‘Rectangle‘; } } class Square implements Shape{ public function draw(){ echo ‘Square‘; } } class Circle implements Shape{ public function draw(){ echo ‘Circle‘; } } // 2.2 顏色實體類 class Red implements Color{ public function fill(){ echo ‘Red‘; } } class Green implements Color{ public function fill(){ echo ‘Green‘; } } class Blue implements Color{ public function fill(){ echo ‘Blue‘; } } // 3 抽象工廠類 interface Factory{ function getShape( string $shapeType ); function getColor( string $color ); } // 4.工廠實體類 class ShapeFactory implements Factory{ public function getShape( string $shapeType){ if( empty($shapeType) ){ return ; } switch( strtolower($shapeType) ){ case ‘rectangle‘: return new Rectangle(); break; case ‘Square‘: return new Square(); break; case ‘circle‘: return new Circle(); break; //如果有其他圖形,可以擴展 } return ; } public function getColor( string $color ){ //這裏違背了接口隔離原則,此方法在此類中無用,卻被迫實現 return ; } } class ColorFactory implements Factory{ public function getShape( string $shapeType ){ return ; } public function getColor( string $color ){ if( empty($color )){ return ; } switch ( strtolower($color) ) { case ‘red‘: return new Red(); break; case ‘green‘: return new Green(); break; case ‘blue‘: return new Blue(); break; } return ; } } // 5 實現工廠 class FactoryProduct{ public static function getFactory( $choice ){ if( empty(strcasecmp($choice,‘shape‘)) ){ return new ShapeFactory(); } else if ( empty(strcasecmp($choice, ‘color‘)) ){ return new ColorFactory(); } return ; } } try{ $factory = FactoryProduct::getFactory(‘shape‘); $shape = $factory->getShape(‘circle‘); $shape->draw(); // } catch( Exception $e){ // php5 捕獲異常,不可以捕獲錯誤 // echo $e->getMessage(); // } } catch( Error $e){ // php7 可以捕獲錯誤 var_dump($e->getMessage()); } // 捕獲錯誤異常的方法 php5 function shutdown_function(){ $e = error_get_last(); // var_dump($e); } register_shutdown_function(‘shutdown_function‘);
php的設計模式------工廠模式