github:
git@github.com:ZQCard/design_pattern.git
/** * 工厂方法 * 使用开闭原则来分析下工厂方法模式。当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成, * 那么就可以被客户使用,而不必去修改任何已有的代码。(即当有新产品时,只要创建并基础抽象产品;新建具体工厂继承抽象工厂; * 而不用修改任何一个类)工厂方法模式是完全符合开闭原则的! */
(1)IShape.class.php(抽象接口,用于规定实现类规范)
<?php namespace FactoryFactoryMethod; interface IShape{ public function draw(); }
(2)AbstractShape.class.php(抽象父类,用于规范子类实现)
<?php namespace FactoryFactoryMethod; abstract class AbstractShape { public abstract function getShape(); }
(3)CircleFactory.class.php(具体工厂类,用于实现指定子类)
<?php namespace FactoryFactoryMethod; class CircleFactory extends AbstractShape { public function getShape() { return new CirCle(); } }
(4)Circle.class.php(具体实现类)
<?php namespace FactoryFactoryMethod; class CirCle { public function draw() { return '画一个圆形'; } }
(5)factoryMethod.php(客户端)
<?php spl_autoload_register(function ($className){ $className = str_replace('\','/',$className); include $className.".class.php"; }); use FactoryFactoryMethodCircleFactory; $factory = new CircleFactory(); $shape = $factory->getShape(); $string = $shape->draw(); echo $sting;
优点:遵守开闭原则
缺点:增加一个产品,需要增加2个类