zoukankan      html  css  js  c++  java
  • 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');
  • 相关阅读:
    对C#中的Close()和Dispose()的浅显理解
    SqlParameter类中的两对好基友:SqlDbType与DbType、SqlValue与Value
    C#通过获取快捷方式指向目标的小示例触碰WMI
    小心UAC
    【TSQL】获取指定日期的常用前后节点(月初月末周一周末等等)
    弹出移动设备时报正在使用肿么办
    再获殊荣!霍格沃兹荣获腾讯金课堂「教育突破奖」
    实战 | 电商业务的性能测试(一): 必备基础知识
    接口测试框架实战(二)| 接口请求断言
    测试老鸟总结的 16 个测试改进 Tips ,让你少走弯路!
  • 原文地址:https://www.cnblogs.com/myvic/p/7978265.html
Copyright © 2011-2022 走看看