设计模式之工厂模式之工厂方法

github:
[email protected]:ZQCard/design_pattern.git
<br />/**
 * 工厂方法
 * 使用开闭原则来分析下工厂方法模式。当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,
 * 那么就可以被客户使用,而不必去修改任何已有的代码。(即当有新产品时,只要创建并基础抽象产品;新建具体工厂继承抽象工厂;
 * 而不用修改任何一个类)工厂方法模式是完全符合开闭原则的!
 */

(1)IShape.class.php(抽象接口,用于规定实现类规范)

<?php

namespace Factory\FactoryMethod;

interface IShape{
    public function draw();
}

(2)AbstractShape.class.php(抽象父类,用于规范子类实现)

<?php

namespace Factory\FactoryMethod;


abstract class AbstractShape
{
    public abstract function getShape();
}

(3)CircleFactory.class.php(具体工厂类,用于实现指定子类)

<?php
namespace Factory\FactoryMethod;

class CircleFactory extends AbstractShape
{
    public function getShape()
    {
        return new CirCle();
    }
}

(4)Circle.class.php(具体实现类)

<?php

namespace Factory\FactoryMethod;


class CirCle
{
    public function draw()
    {
        return '画一个圆形';
    }
}

(5)factoryMethod.php(客户端)

<?php

spl_autoload_register(function ($className){
    $className = str_replace('\\','/',$className);
    include $className.".class.php";
});

use \Factory\FactoryMethod\CircleFactory;

$factory = new CircleFactory();
$shape = $factory->getShape();
$string = $shape->draw();
echo $sting;

优点:遵守开闭原则

缺点:增加一个产品,需要增加2个类