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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                9.2 抽象工廠模式的定義 抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,其定義如下: Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(為創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。) 抽象工廠模式的通用類圖如圖9-3所示。 ![](https://box.kancloud.cn/2016-08-14_57b003611ad62.jpg) 圖9-3 抽象工廠模式的通用類圖 抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是一種非常好的解決方式。我們來看看抽象工廠的通用源代碼,首先有兩個互相影響的產品線(也叫做產品族),例如制造汽車的左側門和右側門,這兩個應該是數量相等的——兩個對象之間的約束,每個型號的車門都是不一樣的,這是產品等級結構約束的,我們先看看兩個產品族的類圖,如圖9-4所示。 ![](https://box.kancloud.cn/2016-08-14_57b00361308d4.jpg) 圖9-4 抽象工廠模式的通用源碼類圖 注意類圖上的圈圈、框框相對應,兩個抽象的產品類可以有關系,例如共同繼承或實現一個抽象類或接口,其源代碼如代碼清單9-11所示。 代碼清單9-11 抽象產品類 public?abstract?class?AbstractProductA?{??? ?????//每個產品共有的方法 ?????public?void?shareMethod(){ ?????} ?????//每個產品相同方法,不同實現 ?????public?abstract?void?doSomething(); } 兩個具體的產品實現類如代碼清單9-12、代碼清單9-13所示。 代碼清單9-12 產品A1的實現類 public?class?ProductA1?extends?AbstractProductA?{ ?????public?void?doSomething()?{ ?????????????System.out.println("產品A1的實現方法"); ?????} } 代碼清單9-13 產品A2的實現類 public?class?ProductA2?extends?AbstractProductA?{ ?????public?void?doSomething()?{ ?????????????System.out.println("產品A2的實現方法"); ?????} } 產品B與此類似,不再贅述。抽象工廠類AbstractCreator的職責是定義每個工廠要實現的功能,在通用代碼中,抽象工廠類定義了兩個產品族的產品創建,如代碼清單9-14所示。 代碼清單9-14 抽象工廠類 public?abstract?class?AbstractCreator?{ ?????//創建A產品家族 ?????public?abstract?AbstractProductA?createProductA();? ?????//創建B產品家族 ?????public?abstract?AbstractProductB?createProductB(); } 注意 有N個產品族,在抽象工廠類中就應該有N個創建方法。 如何創建一個產品,則是由具體的實現類來完成的,Creator1和Creator2如代碼清單9-15和代碼清單9-16所示。 代碼清單9-15 產品等級1的實現類 public?class?Creator1?extends?AbstractCreator?{???? ?????//只生產產品等級為1的A產品 ?????public?AbstractProductA?createProductA()?{? ?????????????return?new?ProductA1(); ?????} ?????//只生產產品等級為1的B產品 ?????public?AbstractProductB?createProductB()?{ ?????????????return?new?ProductB1(); ?????} } 代碼清單9-16 產品等級2的實現類 public?class?Creator2?extends?AbstractCreator?{???? ?????//只生產產品等級為2的A產品 ?????public?AbstractProductA?createProductA()?{? ?????????????return?new?ProductA2(); ?????} ?????//只生產產品等級為2的B產品 ?????public?AbstractProductB?createProductB()?{ ?????????????return?new?ProductB2(); ?????} } 注意 有M個產品等級就應該有M個實現工廠類,在每個實現工廠中,實現不同產品族的生產任務。 在具體的業務中如何產生一個與實現無關的對象呢?如代碼清單9-17所示。 代碼清單9-17 場景類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ?????????????//定義出兩個工廠 ?????????????AbstractCreator?creator1?=?new?Creator1(); ?????????????AbstractCreator?creator2?=?new?Creator2(); ?????????????//產生A1對象 ?????????????AbstractProductA?a1?=??creator1.createProductA(); ?????????????//產生A2對象 ?????????????AbstractProductA?a2?=?creator2.createProductA(); ?????????????//產生B1對象 ?????????????AbstractProductB?b1?=?creator1.createProductB(); ?????????????//產生B2對象 ?????????????AbstractProductB?b2?=?creator2.createProductB(); ?????????????/* ??????????????*?然后在這里就可以為所欲為了... ??????????????*/ ?????} } 在場景類中,沒有任何一個方法與實現類有關系,對于一個產品來說,我們只要知道它的工廠方法就可以直接產生一個產品對象,無須關心它的實現類。
                  <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>

                              哎呀哎呀视频在线观看