php的设计模式------工厂模式

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');

 

posted @ 2017-12-04 17:47  myvic  阅读(291)  评论(0编辑  收藏  举报