<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                工廠模式的作用: 避免直接實例化對象,如果我們在很多地方都要實例化此對象,但是某一天對象的名字需要更改時,所有實例化的地方都要修改,而有了工廠模式就只修改工廠模式代碼里的類名就可以了 <b style="color:red">**簡單工廠--靜態工廠方法模式**</b> >[danger] 我們把被創建的對象稱為“產品”,把創建產品的對象稱為“工廠”。如果要創建的產品不多,只要一個工廠類就可以完成 > 它的缺點是增加新產品時會違背“開閉原則” ``` //抽象產品 interface Fruit { # 種植 public function plant(); # 收獲 public function harvest(); } //具體產品實現 class Apple implements Fruit { # 種植 public function plant(){ echo "蘋果種下啦"; } # 收獲 public function harvest(){ echo "蘋果收獲啦"; } } class Banana implements Fruit { # 種植 public function plant(){ echo "香蕉種下啦"; } # 收獲 public function harvest(){ echo "香蕉收獲啦"; } } //簡單工廠--靜態工廠方法模式 class SimpleFactory { public static function getFruitByParam($type) { switch ($fruitName) { case 'apple': return new Apple(); break; case 'banana': return new Banana(); break; default: throw new Exception("Error no the fruit"); break; } } } // 如果不用工廠模式,則需要提前指定具體類 // $fruit= new Apple(); // echo $fruit->plant(); // $fruit= new Banana(); // echo $fruit->plant(); // 用工廠模式,則不需要知道對象由什么類產生,交給工廠去決定 $fruit = SimpleFactory::getFruitByParam('Apple'); echo $fruit ->plant(); $fruit = SimpleFactory::getFruitByParam('Banana'); echo $fruit ->plant(); ``` <b style="color:red">**工廠方法--多態性工廠模式②**</b> >[danger]**主要優點有:** >* 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程; >* 在系統增加新的產品時只需要添加具體產品類和對應的具體工廠類,無須對原工廠進行任何修改,滿足開閉原則; > >**其缺點是:** >* 每增加一個產品就要增加一個具體產品類和一個對應的具體工廠類,這增加了系統的復雜度。 ![](https://img.kancloud.cn/37/74/3774f86ccb714b82e76d9e6ddcc66d6b_810x394.png) ~~~ /** * 虛擬產品接口類 * 定義好需要實現的方法 */ interface Fruit{ # 種植 public function plant(); # 生長 public function grow(); # 收獲 public function harvest(); # 吃 public function eat(); } /** * 定義具體產品類 蘋果 * 首先,我們要實現所繼承的接口所定義的方法 * 然后定義蘋果所特有的屬性,以及方法 */ class Apple implements Fruit{ # 蘋果樹有年齡 private $treeAge; # 蘋果有顏色 private $color; # 種植 繼承fruit接口 public function plant(){ echo "grape plant"; } # 生長 繼承fruit接口 public function grow(){ echo "grape grow"; } # 收獲 繼承fruit接口 public function harvest(){ echo "grape harvest"; } # 吃 繼承fruit接口 public function eat(){ echo "grape eat"; } # 取蘋果樹的年齡 public function getTreeAge(){ return $this->treeAge; } # 設置蘋果樹的年齡 public function setTreeAge($age){ $this->treeAge = $age; return trie; } } /** * 定義具體產品類 葡萄 * 首先,我們要實現所繼承的接口所定義的方法 * 然后定義葡萄所特有的屬性,以及方法 */ class Grape implements Fruit{ # 葡萄是否有籽 private $seedLess; # 種植 繼承fruit接口 public function plant(){ echo "grape plant"; } # 生長 繼承fruit接口 public function grow(){ echo "grape grow"; } # 收獲 繼承fruit接口 public function harvest(){ echo "grape harvest"; } # 吃 繼承fruit接口 public function eat(){ echo "grape eat"; } # 獲取葡萄有籽無籽 public function getSeedLess(){ return $this->seedLess; } # 設置葡萄有籽無籽 public function setTreeAge($age){ $this->treeAge = $age; return trie; } } # 農場主Farmer(工廠)類接口 用來獲取實例化的水果 interface CommFactory { # 定義個靜態工廠方法 public function getFruit(); } # 蘋果農場(工廠) class AppleFarm implements CommFactory{ public function getFruit(){ return new Apple(); } } # 葡萄農場(工廠) class GrapeFarm implements CommFactory{ public function getFruit(){ return new Grape(); } } # 調用 $appleFarm = new AppleFarm(); $apple=$appleFarm->getFruit(); $apple->plant(); $grapeFarm = new GrapeFarm(); $grape=$grapeFarm->getFruit(); ~~~ <b style="color:red">**抽象工廠--工具箱模式(ToolKit):**</b> 使用抽象工廠模式一般要滿足以下條件。 * 系統中有多個產品族,每個具體工廠創建同一族但屬于不同等級結構的產品。 * 系統一次只可能消費其中某一族產品,即同族的產品一起使用。 抽象工廠模式除了具有工廠方法模式的優點外,其他主要優點如下。 * 可以在類的內部對產品族中相關聯的多等級產品共同管理,而不必專門引入多個新的類來進行管理。 * 當增加一個新的產品族時不需要修改原代碼,滿足開閉原則。 其缺點是:當產品族中需要增加一個新的產品時,所有的工廠類都需要進行修改。 ![](https://img.kancloud.cn/3a/9b/3a9b701a75e0ba7971e862d89a354b3f_662x635.png) ~~~ /** * 虛擬產品接口類 * 定義好需要實現的方法 */ interface Fruit{ # 種植 public function plant(); # 生長 public function grow(); # 收獲 public function harvest(); # 吃 public function eat(); } /** * 定義具體產品類 蘋果 * 首先,我們要實現所繼承的接口所定義的方法 * 然后定義蘋果所特有的屬性,以及方法 */ class Apple implements Fruit{ # 蘋果樹有年齡 private $treeAge; # 蘋果有顏色 private $color; # 種植 繼承fruit接口 public function plant(){ echo "grape plant"; } # 生長 繼承fruit接口 public function grow(){ echo "grape grow"; } # 收獲 繼承fruit接口 public function harvest(){ echo "grape harvest"; } # 吃 繼承fruit接口 public function eat(){ echo "grape eat"; } # 取蘋果樹的年齡 public function getTreeAge(){ return $this->treeAge; } # 設置蘋果樹的年齡 public function setTreeAge($age){ $this->treeAge = $age; return trie; } } /** * 定義具體產品類 葡萄 * 首先,我們要實現所繼承的接口所定義的方法 * 然后定義葡萄所特有的屬性,以及方法 */ class Grape implements Fruit{ # 葡萄是否有籽 private $seedLess; # 種植 繼承fruit接口 public function plant(){ echo "grape plant"; } # 生長 繼承fruit接口 public function grow(){ echo "grape grow"; } # 收獲 繼承fruit接口 public function harvest(){ echo "grape harvest"; } # 吃 繼承fruit接口 public function eat(){ echo "grape eat"; } # 獲取葡萄有籽無籽 public function getSeedLess(){ return $this->seedLess; } # 設置葡萄有籽無籽 public function setTreeAge($age){ $this->treeAge = $age; return trie; } } #業務擴張 農場遍布不同區域 interface Area{ public function showArea(); } class SichuanArea implements Area{ public function showArea(){ echo "四川地區"; } } class GuizhouArea implements Area{ public function showArea(){ echo "貴州地區"; } } # 抽象農場主Farmer(工廠) interface AbstractFactory { # 定義個靜態工廠方法 public function getFruit(); public function getArea(); } # 四川的蘋果農場(工廠) class SichuanAppleFarm implements AbstractFactory { public function getFruit(){ return new Apple(); } public function getArea(){ return new SichuanArea(); } } # 四川的葡萄農場(工廠) class SichuanGrapeFarm implements AbstractFactory { public function getFruit(){ return new Grape(); } public function getArea(){ return new SichuanArea(); } } # 貴州的葡萄農場(工廠) class GuizhouGrapeFarm implements AbstractFactory { public function getFruit(){ return new Grape(); } public function getArea(){ return new GuizhouArea(); } } # 貴州的蘋果農場(工廠) class GuizhouAppleFarm implements AbstractFactory { public function getFruit(){ return new Apple(); } public function getArea(){ return new GuizhouArea(); } } # 調用 $gaf=new GuizhouAppleFarm();//貴州葡萄園 $gaf->getArea()->showArea(); $gaf->getFruit()->plant(); $sgf= new SichuanGrapeFarm();//四川葡萄園 $sgf->getArea()->showArea(); $sgf->getFruit()->plant(); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看