<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之旅 廣告
                # Java 中的原型設計模式 > 原文: [https://howtodoinjava.com/design-patterns/creational/prototype-design-pattern-in-java/](https://howtodoinjava.com/design-patterns/creational/prototype-design-pattern-in-java/) 在構建實際對象之前, [**原型**](https://en.wikipedia.org/wiki/Prototype "Prototype")是任何對象的模板。 同樣在 Java 中,它具有相同的含義。 原型設計模式用于應用需要創建多個類實例的情況,這些實例的狀態幾乎相同或相差很小。 在這種設計模式中,在啟動時會創建一個實際對象的實例(即原型),此后每當需要一個新實例時,都會將該原型克隆為另一個實例。 此模式的主要**優勢**是具有最少的實例創建過程,該過程比克隆過程要昂貴得多。 ```java Table of Contents Design participants Problem statement Implementation ``` > 請確保您要對原型進行[深克隆或淺克隆](https://howtodoinjava.com/java/cloning/a-guide-to-object-cloning-in-java/ "A guide to object cloning in java"),因為兩者在運行時的行為不同。 如果需要深度復制,則可以使用在內存序列化中使用[此處](https://howtodoinjava.com/java/serialization/how-to-do-deep-cloning-using-in-memory-serialization-in-java/ "How to do deep cloning using in memory serialization in java")給出的良好技術。 ## 原型模式 – 參與者 * **原型**:這是如上所述的實際對象的原型。 * **原型注冊表**:用作注冊表服務,使所有原型都可以使用簡單的字符串參數進行訪問。 * **客戶端**:客戶端將負責使用注冊表服務訪問原型實例。 ## 問題陳述 讓我們通過一個例子來了解這種模式。 我正在創建一個娛樂應用,該應用將非常頻繁地需要`Movie`,`Album`和`Show`類的實例。 我不想每次都創建它們的實例,因為這很昂貴。 因此,我將創建他們的原型實例,每當我需要一個新實例時,我都將克隆該原型。 ## 原型模式示例 – 實現 讓我們從創建類圖開始。 ![prototype-pattern-class-diagram](https://img.kancloud.cn/cc/9a/cc9a0eba7b43f92f1574c4cfefa99cb6_1127x672.png) 上面的類圖說明了必要的類及其之間的關系。 解決方案中僅增加了一個接口“`PrototypeCapable`”。 使用此接口的原因是[`Cloneable`接口](//howtodoinjava.com/java/cloning/cloneable-interface-is-broken-in-java/ "Cloneable interface is broken in java")的損壞行為。 該接口有助于實現以下目標: * 能夠克隆原型而不知道它們的實際類型 * 提供要在注冊表中使用的類型引用 他們的工作流程將如下所示: ![Prototype pattren sequence diagram](https://img.kancloud.cn/35/c5/35c50aa9446d3a8f3334511cdcdfdd05_601x581.png) 讓我們敲鍵盤并編寫這些類。 **`PrototypeCapable.java`** ```java package com.howtodoinjava.prototypeDemo.contract; public interface PrototypeCapable extends Cloneable { public PrototypeCapable clone() throws CloneNotSupportedException; } ``` **`Movie.java`,`Album.java`和`Show.java`** ```java package com.howtodoinjava.prototypeDemo.model; import com.howtodoinjava.prototypeDemo.contract.PrototypeCapable; public class Movie implements PrototypeCapable { private String name = null; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Movie clone() throws CloneNotSupportedException { System.out.println("Cloning Movie object.."); return (Movie) super.clone(); } @Override public String toString() { return "Movie"; } } public class Album implements PrototypeCapable { private String name = null; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Album clone() throws CloneNotSupportedException { System.out.println("Cloning Album object.."); return (Album) super.clone(); } @Override public String toString() { return "Album"; } } public class Show implements PrototypeCapable { private String name = null; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Show clone() throws CloneNotSupportedException { System.out.println("Cloning Show object.."); return (Show) super.clone(); } @Override public String toString() { return "Show"; } } ``` **`PrototypeFactory.java`** ```java package com.howtodoinjava.prototypeDemo.factory; import com.howtodoinjava.prototypeDemo.contract.PrototypeCapable; import com.howtodoinjava.prototypeDemo.model.Album; import com.howtodoinjava.prototypeDemo.model.Movie; import com.howtodoinjava.prototypeDemo.model.Show; public class PrototypeFactory { public static class ModelType { public static final String MOVIE = "movie"; public static final String ALBUM = "album"; public static final String SHOW = "show"; } private static java.util.Map<String , PrototypeCapable> prototypes = new java.util.HashMap<String , PrototypeCapable>(); static { prototypes.put(ModelType.MOVIE, new Movie()); prototypes.put(ModelType.ALBUM, new Album()); prototypes.put(ModelType.SHOW, new Show()); } public static PrototypeCapable getInstance(final String s) throws CloneNotSupportedException { return ((PrototypeCapable) prototypes.get(s)).clone(); } } ``` **`TestPrototypePattern`** ```java package com.howtodoinjava.prototypeDemo.client; import com.howtodoinjava.prototypeDemo.factory.PrototypeFactory; import com.howtodoinjava.prototypeDemo.factory.PrototypeFactory.ModelType; public class TestPrototypePattern { public static void main(String[] args) { try { String moviePrototype = PrototypeFactory.getInstance(ModelType.MOVIE).toString(); System.out.println(moviePrototype); String albumPrototype = PrototypeFactory.getInstance(ModelType.ALBUM).toString(); System.out.println(albumPrototype); String showPrototype = PrototypeFactory.getInstance(ModelType.SHOW).toString(); System.out.println(showPrototype); } catch (CloneNotSupportedException e) { e.printStackTrace(); } } } ``` 運行客戶端代碼時,輸??出如下。 ```java Cloning Movie object.. Movie Cloning Album object.. Album Cloning Show object.. Show ``` 希望您喜歡 **Java 原型模式示例**上的這篇文章。 如有任何疑問,請發表評論。 [**下載源碼**](//howtodoinjava.com/wp-content/downloads/PrototypePatternDemo.zip "下載源碼 for prototype design pattern in java") 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看