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