Designmuster Zen-Designmuster-Prototypmuster

Designmuster Zen-Designmuster-Prototypmuster

1: Definition des Prototypmusters

Verwenden Sie Prototypinstanzen, um die zu erstellenden Objekttypen anzugeben, und erstellen Sie neue Objekte, indem Sie diese Prototypen kopieren.

Die Einfachheit des Prototyp-Musters übertrifft nur das Singleton-Muster und das Iterator-Muster. Gerade wegen seiner Einfachheit ist es in so vielen Szenarien einsetzbar.

​ Der Kern des Prototypmodus ist eine Klonmethode, mit der das Objekt kopiert wird. Java bietet eine klonbare Schnittstelle, um anzuzeigen, dass das Objekt kopierbar ist. Warum wird es „Markierung“ genannt? Öffnen Sie die JDK-Hilfe, um zu sehen, was klonbar ist. Es gibt keine Methode. Diese Schnittstelle ist nur eine Markierung. Nur Objekte mit dieser Markierung können in die JVM kopiert werden. Wie können wir also von „Kann kopiert werden“ in „Kann kopiert werden“ konvertieren? Die Methode besteht darin, die clone()-Methode zu überschreiben. Ja, Sie haben es richtig gelesen, sie dient dazu, die clone()-Methode zu überschreiben. Schauen Sie sich das an Das oben Genannte finden Sie in unserer Mail-Klassen-Klonmethode. Diese Methode überschreibt die Methode des Object-Objekts

2: Vorteile des Prototypenmodus

​ ● Hervorragende Leistung ​ Der Prototypmodus ist eine Kopie des Binärstroms im Speicher, was eine viel bessere Leistung bietet als die direkte Neuerstellung eines Objekts. Insbesondere wenn eine große Anzahl von Objekten in einer Schleife generiert wird, kann der Prototypmodus seine besser widerspiegeln Vorteile.

​ ● Entfliehen Sie den Einschränkungen des Konstruktors ​ Dies ist sowohl sein Vorteil als auch sein Nachteil. Beim direkten Kopieren in den Speicher wird der Konstruktor nicht ausgeführt (siehe Abschnitt 13.4). Der Vorteil besteht darin, dass Einschränkungen reduziert werden, und der Nachteil besteht darin, dass auch Einschränkungen reduziert werden, was in praktischen Anwendungen berücksichtigt werden muss.

Drei: Anwendungsszenarien des Prototypenmodus

​ ● Szenarien zur Ressourcenoptimierung

Die Klasseninitialisierung erfordert die Verarbeitung vieler Ressourcen, einschließlich Daten, Hardwareressourcen usw.

​ ● Szenarien mit Leistungs- und Sicherheitsanforderungen

​ Wenn die Generierung eines Objekts über new eine sehr umständliche Datenvorbereitung oder Zugriffsberechtigungen erfordert, können Sie das Prototypmuster verwenden.

​ ● Szenarien, in denen ein Objekt mehrere Modifikatoren hat

​ Wenn ein Objekt für andere Objekte zugänglich sein muss und jeder Aufrufer möglicherweise seinen Wert ändern muss, können Sie erwägen, das Prototypmuster zu verwenden, um mehrere Objekte zur Verwendung durch den Aufrufer zu kopieren.​ In tatsächlichen Projekten erscheint das Prototypmuster selten allein. Es erscheint normalerweise zusammen mit dem Factory-Methodenmuster. Ein Objekt wird durch die Klonmethode erstellt und dann dem Aufrufer durch die Factory-Methode bereitgestellt. Der Prototyp-Modus wurde in Java integriert und kann von jedem genutzt werden.

Viertens: Dinge, die Sie zum Prototypenmodus beachten sollten

构造函数不会被执行 ​ Achten Sie auf eine flache Kopie. Sie fragen sich vielleicht, warum der String-Typ in der Mail-Klasse verwendet werden kann, ohne Probleme durch flache Kopien zu verursachen? Interne Arrays und Referenzobjekte werden nicht kopiert, und andere primitive Typen wie int, long und char usw. werden kopiert. Aber für den String-Typ möchte Java, dass Sie ihn als Basistyp betrachten. Er verfügt über keine Klonmethode und der Verarbeitungsmechanismus ist auch etwas ganz Besonderes. Er wird nur bei Bedarf über den String-Pool im Speicher erstellt. Bei Verwendung des neuen Typs string können Leser einfach String als Basisklasse verwenden.

​ Bei Verwendung des Prototypmusters müssen die referenzierten Mitgliedsvariablen zwei Bedingungen erfüllen, damit sie nicht kopiert werden: Erstens sind sie Mitgliedsvariablen der Klasse, keine Variablen innerhalb der Methode; zweitens müssen sie ein veränderbares Referenzobjekt sein, nicht ein primitiver Typ. oder unveränderliche Objekte.

Eine andere Möglichkeit, eine tiefe Kopie zu implementieren, besteht darin, selbst einen Binärstrom zu schreiben, um das Objekt zu betreiben, und dann eine tiefe Kopie des Objekts zu implementieren. Wenn Sie Zeit haben, können Sie es selbst implementieren.

​ Es wird empfohlen, Deep Copy und Shallow Copy nicht zu mischen, insbesondere wenn es um die Klassenvererbung geht. Die Situation, in der die übergeordnete Klasse mehrere Referenzen hat, ist sehr kompliziert. Die empfohlene Lösung besteht darin, Deep Copy und Shallow Copy getrennt zu implementieren.

Fünftens: Klon und Fianl sind zwei Feinde

​ Ihr Traum, Deep Copy zu realisieren, wurde durch die Bedrohung durch das letzte Schlüsselwort zerstört. Es gibt immer einen Weg. Lassen Sie uns darüber nachdenken, wie Sie diese Methode ändern können: Löschen Sie das letzte Schlüsselwort. Dies ist der bequemste, sicherste und schnellste Weg.

​ Wenn Sie die Klonmethode verwenden möchten, fügen Sie das Schlüsselwort final nicht zu den Mitgliedsvariablen der Klasse hinzu.

Sechs: Best Practices für Prototypenmuster

​ Dies kann folgendermaßen verstanden werden: Die Generierung eines Objekts kann nicht bei Null beginnen, sondern kann direkt von einem Objekt geklont werden, das bereits über einen bestimmten Prototyp verfügt, und dann in das für die Produktion benötigte Objekt geändert werden. Mit anderen Worten: Um einen Menschen hervorzubringen, muss man nicht von einem Jahr auf zwei Jahre und dann auf drei Jahre heranwachsen ... Sie können eine Person auch direkt finden, DNA von ihr erhalten und sie dann klonen Und ändern Sie es direkt, um 30 Jahre alt zu werden! Der Prototypmodus, über den wir sprechen, verfügt über diese Funktion.

Sieben: Beispiel eines Prototypmusters

【1】Vorlage des Prototypmodus

 1 package com.javagpt.design;
 2 /**
 3  * 邮件
 4  * @author javagpt
 5  * 
 6  * 原型模式:(1)实现Cloneable接口
 7  *                    (2)重写Object的clone方法
 8  */
 9 public class Mail implements Cloneable{
10     
11     private String name;
12     
13     private String context;
14     
15     private String title;
16     
17     private String address;
18 
19     
20     public Mail(String name, String context, String title, String address) {
21         super();
22         this.name = name;
23         this.context = context;
24         this.title = title;
25         this.address = address;
26     }
27 
28     
29     /**
30      * 克隆方法
31      */
32     @Override
33     protected Mail clone() throws CloneNotSupportedException {
34         Mail mail1=null;
35         mail1=(Mail) super.clone();
36         return mail1;
37     }
38 
39 
40     public String getName() {
41         return name;
42     }
43 
44     public void setName(String name) {
45         this.name = name;
46     }
47 
48     public String getContext() {
49         return context;
50     }
51 
52     public void setContext(String context) {
53         this.context = context;
54     }
55 
56     public String getTitle() {
57         return title;
58     }
59 
60     public void setTitle(String title) {
61         this.title = title;
62     }
63 
64     public String getAddress() {
65         return address;
66     }
67 
68     public void setAddress(String address) {
69         this.address = address;
70     }
71     
72     
73 }

【2】Flache Kopie

 1 package com.javagpt.design;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 
 7 
 8 /**
 9  * 浅拷贝
10  * @author javagpt
11  * (1)JVM做了一个偷懒的拷贝动作,Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象
12 的内部元素地址,这种拷贝就叫做浅拷贝
13  *(2)非常不安全
14  *
15  */
16 public class Thing implements Cloneable {
17     
18     private List<String> list=new ArrayList<String>();
19 
20 
21     @Override
22     protected Thing clone() throws CloneNotSupportedException {
23         Thing thing=null;
24         thing=(Thing) super.clone();
25         return thing;
26     }
27 
28     public List<String> getList() {
29         return list;
30     }
31 
32     public void setList(String a) {
33         this.list.add(a);
34     }
35     
36     
37 }

【3】Tiefe Kopie

 1 package com.javagpt.design;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 /**
 6  * 深层次拷贝
 7  * (1)深拷贝还有一种实现方式就是通过自己写二进制流来操作对象,然后实现对象的深拷贝,这个大家有时间自己实现一下
 8  * (2)深拷贝和浅拷贝建议不要混合使用,特别是在涉及类的继承时,父类有多个引用的情况就非常复杂,建议的方案是深拷贝和浅拷贝分开实现。
 9  * @author javagpt
10  *
11  */
12 public class Thing2 implements     Cloneable {
13     private ArrayList<String> list=new ArrayList<String>();
14 
15 
16     @Override
17     protected Thing2 clone() throws CloneNotSupportedException {
18         Thing2 thing2=null;
19         thing2=(Thing2) super.clone();
20         thing2.list=(ArrayList<String>) this.list.clone();
21         return thing2;
22     }
23 
24     public List<String> getList() {
25         return list;
26     }
27 
28     public void setList(String a) {
29         this.list.add(a);
30     }
31     
32 }

【4】Kundentest

 1 package com.javagpt.design;
 2 
 3 import java.util.List;
 4 
 5 
 6 public class ClientTest {
 7 
 8     public static void main(String[] args) throws CloneNotSupportedException {
 9         //test01();
10         //test02();
11         test03();
12     }
13     
14     /**
15      * 原型模式:模板测试
16      * @throws CloneNotSupportedException 
17      */
18     public static void test01() throws CloneNotSupportedException{
19         Mail mail=new Mail("javagpt", "go smx", "emailtojavagpt", "[email protected]");//ClientTest.main()com.javagpt.design.Mail@2a5330
20         System.out.println("ClientTest.main()"+mail.toString());
21         Mail mail2=mail.clone();
22         System.out.println("ClientTest.main()"+mail2.toString());//ClientTest.main()com.javagpt.design.Mail@18872380
23         
24     }
25     /**
26      * 原型模式:浅拷贝
27      * @throws CloneNotSupportedException 
28      */
29     public static void test02() throws CloneNotSupportedException{
30         Thing thing1=new Thing();
31         thing1.setList("小李");
32         Thing thing2=thing1.clone();
33         thing1.setList("小张");
34         List<String> t=thing1.getList();
35         List<String> t2=thing2.getList();
36         for (int i = 0; i < t.size(); i++) {
37             System.out.println("ClientTest.test02(t==>)"+t.get(i));
38         }
39         for (int i = 0; i < t2.size(); i++) {
40             System.out.println("ClientTest.test02(t2==>)"+t2.get(i));
41         }
42         //ClientTest.test02(t==>)小李
43         //ClientTest.test02(t==>)小张
44         //ClientTest.test02(t2==>)小李
45         //ClientTest.test02(t2==>)小张
46     }
47     
48     /**
49      * 原型模式:深拷贝
50      * @throws CloneNotSupportedException 
51      */
52     public static void test03() throws CloneNotSupportedException{
53         Thing2 thing2a=new Thing2();
54         thing2a.setList("小李");
55         Thing2 thing2b=thing2a.clone();
56         thing2a.setList("小张");
57         List<String> t=thing2a.getList();
58         List<String> t2=thing2b.getList();
59         for (int i = 0; i < t.size(); i++) {
60             System.out.println("ClientTest.test02(t==>)"+t.get(i));
61         }
62         for (int i = 0; i < t2.size(); i++) {
63             System.out.println("ClientTest.test02(t2==>)"+t2.get(i));
64         }
65         //ClientTest.test02(t==>)小李
66         //ClientTest.test02(t==>)小张
67         //ClientTest.test02(t2==>)小李
68     }
69 }

Dieser Artikel wurde von der Blog-Post-Plattform OpenWrite veröffentlicht!

Tang Xiaoou, Gründer von SenseTime, ist im Alter von 55 Jahren verstorben Im Jahr 2023 stagniert PHP Wi-Fi 7 wird vollständig verfügbar sein Anfang 2024 Debüt, fünfmal schneller als Wi-Fi 6 Das Hongmeng-System steht kurz vor der Unabhängigkeit und viele Universitäten haben „Hongmeng-Klassen“ eingerichtet Zhihui Das Startup-Unternehmen von Jun refinanziert sich, der Betrag übersteigt 600 Millionen Yuan und die Pre-Money-Bewertung beträgt 3,5 Milliarden Yuan Quark Browser PC-Version startet interne Tests KI-Code-Assistent ist beliebt, und Programmiersprachen-Rankings sind alle Es gibt nichts, was Sie tun können Das 5G-Modem und die Hochfrequenztechnologie des Mate 60 Pro liegen weit vorne MariaDB spaltet SkySQL auf und etabliert sich als unabhängiges Unternehmen Xiaomi antwortet auf Yu Chengdongs „Keel Pivot“-Plagiatsaussage von Huawei
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/5587102/blog/10142387
Recomendado
Clasificación