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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## [注冊工廠](https://lingcoder.gitee.io/onjava8/#/book/19-Type-Information?id=%e6%b3%a8%e5%86%8c%e5%b7%a5%e5%8e%82) 從`Pet`層次結構生成對象的問題是,每當向層次結構中添加一種新類型的`Pet`時,必須記住將其添加到`LiteralPetCreator.java`的條目中。在一個定期添加更多類的系統中,這可能會成為問題。 你可能會考慮向每個子類添加靜態初始值設定項,因此初始值設定項會將其類添加到某個列表中。不幸的是,靜態初始值設定項僅在首次加載類時調用,因此存在雞和蛋的問題:生成器的列表中沒有類,因此它無法創建該類的對象,因此類不會被加載并放入列表中。 基本上,你必須自己手工創建列表(除非你編寫了一個工具來搜索和分析源代碼,然后創建和編譯列表)。所以你能做的最好的事情就是把列表集中放在一個明顯的地方。層次結構的基類可能是最好的地方。 我們在這里所做的另一個更改是使用*工廠方法*設計模式將對象的創建推遲到類本身。工廠方法可以以多態方式調用,并為你創建適當類型的對象。事實證明,`java.util.function.Supplier`用`T get()`描述了原型工廠方法。協變返回類型允許`get()`為`Supplier`的每個子類實現返回不同的類型。 在本例中,基類`Part`包含一個工廠對象的靜態列表,列表成員類型為`Supplier<Part>`。對于應該由`get()`方法生成的類型的工廠,通過將它們添加到`prototypes`列表向基類“注冊”。奇怪的是,這些工廠本身就是對象的實例。此列表中的每個對象都是用于創建其他對象的*原型*: ~~~ // typeinfo/RegisteredFactories.java // 注冊工廠到基礎類 import java.util.*; import java.util.function.*; import java.util.stream.*; class Part implements Supplier<Part> { @Override public String toString() { return getClass().getSimpleName(); } static List<Supplier<? extends Part>> prototypes = Arrays.asList( new FuelFilter(), new AirFilter(), new CabinAirFilter(), new OilFilter(), new FanBelt(), new PowerSteeringBelt(), new GeneratorBelt() ); private static Random rand = new Random(47); public Part get() { int n = rand.nextInt(prototypes.size()); return prototypes.get(n).get(); } } class Filter extends Part {} class FuelFilter extends Filter { @Override public FuelFilter get() { return new FuelFilter(); } } class AirFilter extends Filter { @Override public AirFilter get() { return new AirFilter(); } } class CabinAirFilter extends Filter { @Override public CabinAirFilter get() { return new CabinAirFilter(); } } class OilFilter extends Filter { @Override public OilFilter get() { return new OilFilter(); } } class Belt extends Part {} class FanBelt extends Belt { @Override public FanBelt get() { return new FanBelt(); } } class GeneratorBelt extends Belt { @Override public GeneratorBelt get() { return new GeneratorBelt(); } } class PowerSteeringBelt extends Belt { @Override public PowerSteeringBelt get() { return new PowerSteeringBelt(); } } public class RegisteredFactories { public static void main(String[] args) { Stream.generate(new Part()) .limit(10) .forEach(System.out::println); } } ~~~ 輸出結果: ~~~ GeneratorBelt CabinAirFilter GeneratorBelt AirFilter PowerSteeringBelt CabinAirFilter FuelFilter PowerSteeringBelt PowerSteeringBelt FuelFilter ~~~ 并非層次結構中的所有類都應實例化;這里的`Filter`和`Belt`只是分類器,這樣你就不會創建任何一個類的實例,而是只創建它們的子類(請注意,如果嘗試這樣做,你將獲得`Part`基類的行為)。 因為`Part implements Supplier<Part>`,`Part`通過其`get()`方法供應其他`Part`。如果為基類`Part`調用`get()`(或者如果`generate()`調用`get()`),它將創建隨機特定的`Part`子類型,每個子類型最終都從`Part`繼承,并重寫相應的`get()`以生成它們中的一個。
                  <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>

                              哎呀哎呀视频在线观看