[淺談設計模式(一)] 讓你一分鐘讀懂設計模式

best輝發表於2018-09-30

碎碎念:

最近剛學習了設計模式,作為一個初學者,在此分享我在學習中的一些理解和總結,大家一起學習和共勉,希望對大家有所幫助;在大家看了以後,覺得我理解和總結有不到位或者不對的地方希望大家在留言區指出,我會及時修改,感謝!!!

前言:

設計模式有超過20多種,這裡我只分享給大家幾個常用的設計模式(每篇文章只介紹一種設計模式,如果全部介紹,文章的篇幅會過長,對於閱讀和理解也不友好,望諒解),分享的每個設計模式都會透過3個方面(定義、舉例說明、程式碼說明)進行講解和說明。
常用的設計模式:
1.工廠模式、2.單例模式、3.介面卡模式、4.觀察者模式、5.策略模式、
6.註冊樹模式(它的定位可能和“簡單工廠”差不多,都是一種簡化的,實用的技巧,【不算在真正的的23種設計模式之中】)
7.其他等等模式

學習前的準備:

在學習設計模式前,需要掌握一些類的基礎知識(有經驗的可以跳過),比如:介面、抽象類。(該類知識可學習菜鳥教程裡物件導向這一章)
菜鳥教程: www.runoob.com/php/php-oop.html
介面和抽象類的概念有點相似:
介面:一個類要實現一個介面,類中必須實現介面中定義的所有方法,介面中定義的所有方法都必須是公有。
抽象類:一個類繼承抽象類,子類必須定義父類中的所有抽象方法,子類中的方法訪問控制(public、protected 、private)必須和父類中一樣(或者更為寬鬆),例如某個抽象方法被宣告為受保護的,那麼子類中實現的方法就應該宣告為受保護的或者公有的,而不能定義為私有的。(私有比受保護的更高階和更嚴格)
正文:

工廠模式

a.簡單工廠模式:

1.定義:用來實現建立物件和物件的使用分離,將物件的建立交給專門的工廠類負責。
2.舉例說明:我有一個工廠類,我們有A產品類生產A產品和B產品類生產B產品或更多的產品類,你下單什麼產品,工廠就呼叫指定的產品類進行生產產品。
3.程式碼說明:

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

b.工廠模式:

1.定義:在該模式中,核心的工廠類不再負責所有產品的建立,而是將具體建立工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的介面,而不負責產品類被例項化這種細節。
2.舉例說明:我有一個工廠總部(核心)和一個產品總部(核心),工廠總部負責管工廠,產品總部負責管產品,產品總部下有多少個產品,工廠總部下就有多少個工廠,即指定的工廠生產指定的產品(一對一關係);如果你下單A產品,A工廠就生產產品;你下單B產品,B工廠就生產產品。
3.程式碼說明:

<?php 
  interface Product{     //產品介面(核心類)
      public function getProduct();
  }
  class ProductA implements Product   //A類產品
  {
      public function getProduct(){
          echo "I'm ProductA <br>";
      }
  }
  class ProductB implements Product   /B類產品
  {
      public function getProduct(){
          echo "I'm ProductB <br>";
      }
  }
abstract class Factory{      //抽象工廠類(抽象類)(核心工廠類)
      abstract static function createProduct();
  }
  class ProductAFactory extends Factory   //A工廠繼承工廠類
  {
      public static function createProduct()
      {
          return new ProductA();   //A工廠建立A產品類物件
      }
  }
  class ProductBFactory extends Product  //B工廠繼承工廠類
  {
      public static function createProduct()
      {
          return new ProductB();    //B工廠建立B產品類物件
      }
  }

呼叫:

    注意:宣告為static的靜態方法不能透過new例項化物件進行訪問,必須使用類名::方法名() 訪問
  $ProductA = ProductAFactory::createProduct();
  $ProductA->getProduct();
  $ProductB = ProductBFactory::createProduct();
  $ProductB->getProduct();

c.抽象工廠模式:

1.定義:此模式是對工廠方法模式的進一步擴充套件。在工廠方法模式中,一個具體的工廠負責生產一類具體的產品,即一對一的關係,但是,如果需要一個具體的工廠生產多種產品物件,那麼就需要用到抽象工廠模式了,即一個工廠可以生產多種產品。
2.舉例說明:產品分為2類,有滑鼠產品類總部(核心類),有鍵盤產品類總部(核心類),滑鼠類總部下有戴爾滑鼠、聯想滑鼠2種品牌的滑鼠產品類,鍵盤類總部下也有戴爾鍵盤、聯想鍵盤2種品牌的鍵盤產品類,這時有一個工廠總部類(核心類),可以生產滑鼠和鍵盤,工廠總部下面有戴爾工廠、聯想工廠2種品牌的工廠,但是這2種工廠每個工廠都可以生產滑鼠和鍵盤。
看圖更為直觀:
file
3.程式碼說明:

<?php 
interface Mouse{     //滑鼠產品介面(核心類)
      public function getMouse();  //獲取滑鼠
  }
class DellMouse implements Mouse   //戴爾類產品
  {
      public function getMouse(){
          echo "我是戴爾滑鼠<br>";
      }
  }
class LenovoMouse implements Mouse   //聯想類產品
  {
      public function getMouse(){
          echo "我是聯想滑鼠<br>";
      }
  }
interface Keybo{     //鍵盤產品介面(核心類)
      public function getKeybo();  //獲取鍵盤
  }
class DellKeybo implements Keybo   //戴爾類產品
  {
      public function getKeybo(){
          echo "我是戴爾鍵盤<br>";
      }
  }
class LenovoKeybo implements Keybo   //聯想類產品
  {
      public function getKeybo(){
          echo "我是聯想鍵盤<br>";
      }
  }
abstract class Factory{      //抽象工廠類(核心工廠類)
      abstract static function createMouse(); //生產滑鼠
      abstract static function createKeybo();//生產鍵盤
  }
class DellFactory extends Factory   //戴爾牌工廠繼承工廠類
  {
      public static function createMouse()
      {
          return new DellMouse();   //工廠建立戴爾滑鼠類物件
      }
      public static function createKeybo()
      {
          return new DellKeybo();   //工廠建立戴爾鍵盤類物件
      }
  }
class LenovoFactory extends Factory   //聯想牌工廠繼承工廠類
  {
      public static function createMouse()
      {
          return new LenovoMouse();   //工廠建立聯想滑鼠類物件
      }
      public static function createKeybo()
      {
          return new LenovoKeybo();   //工廠建立聯想鍵盤類物件
      }
  }

呼叫:

//輸出“我是戴爾滑鼠”
$dell_mouse =DellFactory::createMouse();
echo  $dell_mouse->getMouse();
//輸出“我是戴爾鍵盤”
$dell_keybo = DellFactory::createKeybo();
echo $dell_keybo->getKeybo();
//輸出“我是聯想滑鼠”
$lenovo_mouse = LenovoFactory::createMouse();
echo $lenovo_mouse->getMouse();
//輸出“我是聯想鍵盤”
$lenovo_keybo = LenovoFactory::createKeybo();
echo $lenovo_keybo->getKeybo();

好了,工廠模式介紹完畢,有理解和總結不對的地方,希望可以指點一下,後續會繼續分享其他常用模式。
下一篇分享: 部落格:[淺談設計模式(二)] 讓你一分鐘讀懂設計模式

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章