github源码地址:
git@github.com:ZQCard/design_pattern.git
1.简单工厂模式
特点:将调用者与创建者分离,调用者直接向工厂请求,减少代码的耦合.提高系统的可维护性与可扩展性.
缺点:当要修改类的时候,工厂类也需要做出相对应的更改,违反了开闭原则(对于扩展代码开放,对于类内修改关闭).
(1)IShape.class.php (接口,限定子类实现方法)
<?php
namespace Factory\SimpleFactory;
interface IShape{
public function draw();
}
(2)Circle.class.php(具体实现类(圆形))
<?php
namespace Factory\SimpleFactory;
class Circle implements IShape
{
public function draw()
{
return '画一个圆形';
}
}
(3)Square.class.php(具体实现类(正方形))
<?php
namespace Factory\SimpleFactory;
class Square implements IShape
{
public function draw()
{
return '画一个正方形';
}
}
(4)ShapeFactory.class.php(简单工厂类)
<?php
namespace Factory\SimpleFactory;
class ShapeFactory {
const CIRCLE = 'circle';
const SQUARE = 'square';
const RECTANGLE = 'rectangle';
private $shape;
public function __construct($shape)
{
$this->shape = $shape;
}
public function getShape()
{
switch ($this->shape){
case self::CIRCLE:
return new Circle();
break;
case self::SQUARE:
return new Square();
break;
case self::RECTANGLE:
return new Rectangle();
break;
default:
return null;
}
}
}
(5)客户端
<?php
/**
* 简单工厂方法
* 简单工厂:是由一个工厂对象决定创建出哪一种产品类的实例。
* A实例调用B实例的方法,称为A依赖于B。如果使用new关键字来创建一个B实例(硬编码耦合),然后调用B实例的方法。
* 一旦系统需要重构:需要使用C类来代替B类时,程序不得不改写A类代码。而用工厂模式则不需要关心B对象的实现、创建过程。
* 使用简单工厂模式的优势:让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可。
* 从而避免了对象的调用者与对象的实现类以硬编码方式耦合,以提高系统的可维护性、可扩展性。
* 工厂模式也有一个小小的缺陷:当产品修改时,工厂类也要做相应的修改,违反了开-闭原则。
* 如上例,需要增加 椭圆形 时,需要修改工厂类 ShapeFactory
* 简单工厂模式适用于业务简单的情况下或者具体产品很少增加的情况。
*/
spl_autoload_register(function ($className){
$className = str_replace('\\','/',$className);
include $className.".class.php";
});
use Factory\SimpleFactory\ShapeFactory;
$shape = (new ShapeFactory(ShapeFactory::CIRCLE))->getShape();
$sting = $shape->draw();
echo $sting;