PHP程序员

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

2020-08-19  本文已影响0人  php转go

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

    }
上一篇 下一篇

猜你喜欢

热点阅读