PHP面試常考之設計模式——工廠模式

你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。

本週(2019.3.11至3.15)的一三五更新的文章如下:

週一:PHP面試常考之設計模式——工廠模式
週三:PHP面試常考之設計模式——建造者模式
週五:PHP面試常考之設計模式——策略模式

今天這篇文章主要講解的是PHP面試常考的設計模式之工廠模式。工廠模式其實可以劃分爲:簡單工廠模式、工廠方法模式、抽象工廠模式等。具體它們有什麼區別,用途有哪些呢?以下我將進行講解。

自己整理了一篇“設計模式需要遵守的5大原則”的文章,關注公衆號:“琉憶編程庫”,回覆:“原則”,我發給你。

以下內容如需轉載,請註明作者和出處。

1、簡單工廠模式

介紹:
簡單工廠模式又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。

UML圖:

clipboard.png

說明:

  • CashFactory類:負責創建具體產品的實例
  • CashSuper類:抽象產品類,定義產品子類的公共接口
  • CreateCashAccept 類:具體產品類,實現Product父類的接口功能,也可添加自定義的功能

簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。

實現示例:

<?php 
//簡單工廠模式
class Cat
{
  function __construct()
  {
      echo "I am Cat class <br>";
  }
}
class Dog
{
  function __construct()
  {
      echo "I am Dog class <br>";
  }
}
class Factory
{
  public static function CreateAnimal($name){
      if ($name == 'cat') {
          return new Cat();
      } elseif ($name == 'dog') {
          return new Dog();
      }
  }
}

$cat = Factory::CreateAnimal('cat');
$dog = Factory::CreateAnimal('dog');

2、工廠方法模式

介紹:
工廠方法模式通過定義一個抽象的核心工廠類,並定義創建產品對象的接口,創建具體產品實例的工作延遲到其工廠子類去完成。這樣做的好處是核心類只關注工廠類的接口定義,而具體的產品實例交給具體的工廠子類去創建。當系統需要新增一個產品是,無需修改現有系統代碼,只需要添加一個具體產品類和其對應的工廠子類,是系統的擴展性變得很好,符合面向對象編程的開閉原則;

UML圖:

clipboard.png

說明:

  • Product:抽象產品類
  • ConcreteProduct:具體產品類
  • Factory:抽象工廠類
  • ConcreteFactory:具體工廠類

工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了面向對象的多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有產品的創建,而是將具體創建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的接口,而不負責產品類被實例化這種細節,這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。

實現示例:

<?php 
interface Animal{
  public function run();
  public function say();
}
class Cat implements Animal
{
  public function run(){
      echo "I ran slowly <br>";
  }
  public function say(){
      echo "I am Cat class <br>";
  }
}
class Dog implements Animal
{
  public function run(){
      echo "I'm running fast <br>";
  }
  public function say(){
      echo "I am Dog class <br>";
  }
}
abstract class Factory{
  abstract static function createAnimal();
}
class CatFactory extends Factory
{
  public static function createAnimal()
  {
      return new Cat();
  }
}
class DogFactory extends Factory
{
  public static function createAnimal()
  {
      return new Dog();
  }
}

$cat = CatFactory::createAnimal();
$cat->say();
$cat->run();

$dog = DogFactory::createAnimal();
$dog->say();
$dog->run();

自己整理了一篇“設計模式需要遵守的5大原則”的文章,關注公衆號:“琉憶編程庫”,回覆:“原則”,我發給你。

3、抽象工廠模式

介紹:
抽象工廠模式提供一個創建一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲Kit模式,屬於對象創建型模式。

此模式是對工廠方法模式的進一步擴展。在工廠方法模式中,一個具體的工廠負責生產一類具體的產品,即一對一的關係,但是,如果需要一個具體的工廠生產多種產品對象,那麼就需要用到抽象工廠模式了。

爲了便於理解此模式,這裏介紹兩個概念:

產品等級結構:產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。

產品族 :在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。

UML類圖:

clipboard.png

說明:
具體類圖的功能可以看UML圖的說明

實現示例:

<?php 

interface TV{
  public function open();
  public function use();
}

class HaierTv implements TV
{
  public function open()
  {
      echo "Open Haier TV <br>";
  }

  public function use()
  {
      echo "I'm watching TV <br>";
  }
}

interface PC{
  public function work();
  public function play();
}

class LenovoPc implements PC
{
  public function work()
  {
      echo "I'm working on a Lenovo computer <br>";
  }
  public function play()
  {
      echo "Lenovo computers can be used to play games <br>";
  }
}

abstract class Factory{
  abstract public static function createPc();
  abstract public static function createTv();
}

class ProductFactory extends Factory
{
  public static function createTV()
  {
      return new HaierTv();
  }
  public static function createPc()
  {
      return new LenovoPc();
  }
}

$newTv = ProductFactory::createTV();
$newTv->open();
$newTv->use();

$newPc = ProductFactory::createPc();
$newPc->work();
$newPc->play();

自己編寫的《PHP程序員面試筆試寶典》《PHP程序員面試筆試真題解析》書籍,已在各大電商平臺銷售,兩本可以幫助你更快更好的拿到offer的書
圖片描述
更多PHP相關的面試知識、考題可以關注公衆號獲取:琉憶編程庫

clipboard.png

對本文有什麼問題或建議都可以進行留言,我將不斷完善追求極致,感謝你們的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章