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

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

本週(2019.3.11至3.15)的一三五更新的文章以下:程序員

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

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

本身整理了一篇「 設計模式須要遵照的5大原則」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 原則」,我發給你。

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

一、簡單工廠模式

介紹:
簡單工廠模式又稱爲靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,能夠根據參數的不一樣返回不一樣類的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般都具備共同的父類。編程

UML圖:設計模式

clipboard.png

說明:spa

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

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

實現示例:code

<?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');

二、工廠方法模式

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

UML圖:blog

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大原則」的文章,關注公衆號:「 琉憶編程庫」,回覆:「 原則」,我發給你。

三、抽象工廠模式

介紹:
抽象工廠模式提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們具體的類。抽象工廠模式又稱爲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

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

相關文章
相關標籤/搜索