設計模式之工廠模式之簡單工廠(php實現)


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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM