<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>

                ![](https://source.unsplash.com/random/1680x200) ## 抽象工廠模式(Abstract Factory) **概念** 抽象工廠模式提供一個創建一系統相關或相互依賴對象的接口,而無需指定它們具體的類。 抽象工廠模式是工廠方法模式的升級版本,他用來`創建一組相關或者相互依賴的對象`。他與工廠方法模式的區別就在于,__工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構__。 在編程中,通常一個產品結構,表現為一個接口或者抽象類,也就是說,工廠方法模式提供的所有產品都是衍生自同一個接口或抽象類,而抽象工廠模式所提供的產品則是衍生自不同的接口或抽象類。 **主要角色** **抽象工廠(Abstract Factory)角色**:它聲明一個創建抽象產品對象的接口。通常以接口或抽象類實現,所有的具體工廠類必須實現這個接口或繼承這個類。 **具體工廠(Concrete Factory)角色** :實現創建產品對象的操作。客戶端直接調用這個角色創建產品的實例。這個角色包含有選擇合適的產品對象的邏輯。通常使用具體類實現。 **抽象產品(Abstract Product)角色**:聲明一類產品的接口。它是工廠方法模式所創建的對象的父類,或它們共同擁有的接口。 **具體產品(Concrete Product)角色**:實現抽象產品角色所定義的接口,定義一個將被相應的具體工廠創建的產品對象。其內部包含了應用程序的業務邏輯。 **UML圖** ![](https://img.kancloud.cn/3f/41/3f41290c21ef6c79a0735bad25783880_835x574.jpg) **簡單實例** ``` <?php /** * 抽象工廠模式 2010-05-28 sz * @author phppan.p#gmail.com * @package design pattern */ /** * 抽象工廠 */ interface AbstractFactory { /** * 創建等級結構為A的產品的工廠方法 */ public function createProductA(); /** * 創建等級結構為B的產品的工廠方法 */ public function createProductB(); } /** * 具體工廠1 */ class ConcreteFactory1 implements AbstractFactory{ public function createProductA() { return new ProductA1(); } public function createProductB() { return new ProductB1(); } } /** * 具體工廠2 */ class ConcreteFactory2 implements AbstractFactory{ public function createProductA() { return new ProductA2(); } public function createProductB() { return new ProductB2(); } } /** * 抽象產品A */ interface AbstractProductA { /** * 取得產品名 */ public function getName(); } /** * 抽象產品B */ interface AbstractProductB { /** * 取得產品名 */ public function getName(); } /** * 具體產品A1 */ class ProductA1 implements AbstractProductA { private $_name; public function __construct() { $this->_name = 'product A1'; } public function getName() { return $this->_name; } } /** * 具體產品A2 */ class ProductA2 implements AbstractProductA { private $_name; public function __construct() { $this->_name = 'product A2'; } public function getName() { return $this->_name; } } /** * 具體產品B1 */ class ProductB1 implements AbstractProductB { private $_name; public function __construct() { $this->_name = 'product B1'; } public function getName() { return $this->_name; } } /** * 具體產品B2 */ class ProductB2 implements AbstractProductB { private $_name; public function __construct() { $this->_name = 'product B2'; } public function getName() { return $this->_name; } } /** * 客戶端 */ class Client { /** * Main program. */ public static function main() { self::run(new ConcreteFactory1()); self::run(new ConcreteFactory2()); } /** * 調用工廠實例生成產品,輸出產品名 * @param $factory AbstractFactory 工廠實例 */ public static function run(AbstractFactory $factory) { $productA = $factory->createProductA(); $productB = $factory->createProductB(); echo $productA->getName(), '<br />'; echo $productB->getName(), '<br />'; } } Client::main(); ```
                  <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>

                              哎呀哎呀视频在线观看