美文网首页PHP程序员
PHP工厂模式之工厂方法模式

PHP工厂模式之工厂方法模式

作者: php转go | 来源:发表于2020-08-19 11:23 被阅读0次

    1、模式定义
    定义一个创建对象的接口,但是让子类去实例化具体类。工厂方法模式让类的实例化延迟到子类中。
    创建一个抽象类,在抽象类下创建抽象方法,必须由子类去重写实现,

    例如生产猫的玩具,
    代码

    /**工厂方法抽象类
     * Class FactoryMethod
     * @package app\lib\Method
     */
    abstract class FactoryMethod
    {
        /**子类必须实现该方法
         * @param $type
         * @return mixed
         */
        abstract  public function create($type,$color);
    }
    

    可以创建A工厂,生产各种猫玩具。。。
    可以创建B工厂,生产各种狗玩具。。。
    可以创建C工厂,生产各种猪玩具。。。
    继承工厂方法抽象类,每个工厂生产的不一样,必须重写他的create方法

    /**A工厂,
     * Class AFactory
     * @package app\lib\Method
     */
    class AFactory extends FactoryMethod
    {
    
        public function create($type,$color)
        {
            switch ($type) {
                case 0:
                    $obj= new Shorthair();//短毛猫
                    break;
                case 1:
                    $obj= new Persian();//波斯猫
                    break;
                default:
                    $obj= new Domestic();//家猫
                    break;
            }
            $obj->setColor($color);
    
            return $obj;
        }
    }
    

    创建猫玩具接口

    /**猫玩具的接口
     * Interface CatInterface
     * @package app\lib\Method
     */
    interface CatInterface
    {
        /**设置猫的颜色
         * @param $rgb
         * @return mixed
         */
        public function setColor($rgb);
    }
    

    具体产品

    /**波斯猫
     * Class Persian
     * @package app\lib\Method
     */
    class Persian implements CatInterface
    {
    
        private $color;
        public function setColor($rgb)
        {
            $this->color=$rgb;
        }
        public function getColor()
        {
            return $this->color.'波斯猫';
        }
    }
    
    /**短毛猫
     * Class Shorthair
     * @package app\lib\Method
     */
    class Shorthair implements CatInterface
    {
    
        private $color;
        public function setColor($rgb)
        {
            $this->color=$rgb;
        }
        public function getColor()
        {
            return $this->color."短毛猫";
        }
    }
    
    /**家猫
     * Class Domestic
     * @package app\lib\Method
     */
    class Domestic implements CatInterface
    {
    
        private $color;
        public function setColor($rgb)
        {
            $this->color=$rgb;
        }
        public function getColor()
        {
            return $this->color.'家猫';
        }
    }
    

    控制器调用

    public function index(){
            //我们不需要关心什么工厂,知道他可以生产猫就可以了
            $factory=new AFactory();
            //生产蓝色的波斯猫
           $res= $factory->create(0,"蓝色");
           var_dump($res->getColor());
    
        }
    

    相关文章

      网友评论

        本文标题:PHP工厂模式之工厂方法模式

        本文链接:https://www.haomeiwen.com/subject/vybkjktx.html