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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 動態工廠 前面例子中的**靜態**`create()`方法強制所有創建操作都集中在一個位置,因此這是添加新類型的**Shape**時唯一必須更改代碼的地方。這當然是一個合理的解決方案,因為它把創建對象的過程限制在一個框內。但是,如果你在添加新類時無需修改任何內容,那就太好了。 以下版本使用反射在首次需要時將**Shape**的構造器動態加載到工廠列表中: ```java // patterns/ShapeFactory2.java import java.util.*; import java.lang.reflect.*; import java.util.stream.*; import patterns.shapes.*; public class ShapeFactory2 implements FactoryMethod { Map<String, Constructor> factories = new HashMap<>(); static Constructor load(String id) { System.out.println("loading " + id); try { return Class.forName("patterns.shapes." + id) .getConstructor(); } catch(ClassNotFoundException | NoSuchMethodException e) { throw new BadShapeCreation(id); } } public Shape create(String id) { try { return (Shape)factories .computeIfAbsent(id, ShapeFactory2::load) .newInstance(); } catch(InstantiationException | IllegalAccessException | InvocationTargetException e) { throw new BadShapeCreation(id); } } public static void main(String[] args) { FactoryTest.test(new ShapeFactory2()); } } ``` 輸出結果: ```java loading Circle Circle[0] draw Circle[0] erase loading Square Square[1] draw Square[1] erase loading Triangle Triangle[2] draw Triangle[2] erase Square[3] draw Square[3] erase Circle[4] draw Circle[4] erase Circle[5] draw Circle[5] erase Triangle[6] draw Triangle[6] erase ``` 和之前一樣,`create()`方法基于你傳遞給它的**String**參數生成新的**Shape**s,但是在這里,它是通過在**HashMap**中查找作為鍵的**String**來實現的。 返回的值是一個構造器,該構造器用于通過調用`newInstance()`創建新的**Shape**對象。 然而,當你開始運行程序時,工廠的`map`為空。`create()`使用`map`的`computeIfAbsent()`方法來查找構造器(如果該構造器已存在于`map`中)。如果不存在則使用`load()`計算出該構造器,并將其插入到`map`中。 從輸出中可以看到,每種特定類型的**Shape**都是在第一次請求時才加載的,然后只需要從`map`中檢索它。
                  <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>

                              哎呀哎呀视频在线观看