碎碎念:
最近剛學習了設計模式,作為一個初學者,在此分享我在學習中的一些理解和總結,大家一起學習和共勉,希望對大家有所幫助;在大家看了以後,覺得我理解和總結有不到位或者不對的地方希望大家在留言區指出,我會及時修改,感謝!!!
前言:
設計模式有超過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種工廠每個工廠都可以生產滑鼠和鍵盤。
看圖更為直觀:
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 協議》,轉載必須註明作者和本文連結