1. 程式人生 > >php的設計模式------工廠模式

php的設計模式------工廠模式

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‘: return
new 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的設計模式------工廠模式