国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Inhaltsverzeichnis
淺克隆 " >淺克隆
深克隆 " >深克隆
Heim Java javaLernprogramm Master-Prototyp-Modus in fünf Minuten

Master-Prototyp-Modus in fünf Minuten

Aug 25, 2023 pm 03:52 PM
java


Hallo zusammen, ich bin Lao Tian, ????Heute werde ich Designmuster 原型模式 mit euch teilen. Verwenden Sie geeignete Lebensgeschichten und reale Projektszenarien, um über das Entwurfsmuster zu sprechen, und fassen Sie das Entwurfsmuster schlie?lich in einem Satz zusammen.

Master-Prototyp-Modus in fünf Minuten

Geschichte

Ich erinnere mich noch daran, als ich in meinem Abschlussjahr auf Jobsuche war, zuf?llig eine relativ sch?ne Lebenslaufvorlage für Programmierer aus dem Internet gefunden habe und dann die ganze Klasse angefangen hat zu kopieren ihre Lebensl?ufe wie verrückt (U-Disk). Gleichzeitig gab es auch einen Witz, als mehrere Studenten ihre früheren Lebensl?ufe kopierten, ohne den Inhalt oder ihren Namen zu ?ndern. Sp?ter sollte jeder das Ergebnis erraten k?nnen. Alle machten ein Praktikum, und einige von ihnen waren noch auf der Suche nach einem Job. Feedback vom Interviewer im Unternehmen und anderen Klassenkameraden sp?ter: Ich habe mehrere Lebensl?ufe erhalten, die genau gleich waren. Als ich zurückkam, wussten alle, wo das Problem lag, nachdem wir darüber gesprochen hatten. Ich gab zu, dass ich es kopiert und eingereicht hatte ohne es überhaupt zu ?ndern. Schade.

Unterteilen Sie Lebenslaufkopien in zwei Arten:

  • Eine besteht darin, den Lebenslauf zu kopieren und dann die Informationen an Ihre eigenen anzupassen.
  • Die andere besteht darin, den Lebenslauf zu kopieren, ohne den Inhalt zu ?ndern. ?Definition von Prototypmustern“ mit Prototyp-Instanztypen und erstellen Sie neue Objekte durch Kopieren dieser Prototypen. Prototyp-Modus:
    , ein kreativer Modus.
Der Aufrufer muss weder die Erstellungsdetails kennen, noch muss er den Konstruktor aufrufen, um das Objekt zu erstellen.

Nutzungsszenarien

Der Prototyp-Modus verfügt über die folgenden Nutzungsszenarien:

  • Die Klasseninitialisierung verbraucht mehr Ressourcen
  • Ein von new generiertes Objekt erfordert einen sehr langwierigen Prozess (Datenvorbereitung, Zugriffsberechtigungen usw.)
  • Der Konstruktor ist komplizierter
  • Wenn eine gro?e Anzahl von Objekte werden innerhalb des Schleifenk?rpers generiert
  • Im Frühjahr wird h?ufig das Prototypmuster verwendet, zum Beispiel: scope='prototype'scope='prototype'

我們可以將一些getter和setter之類封裝成一個工廠方法,然后對于使用的人來說,調(diào)用方法就可以了,不需要知道里面的getter和setter是怎么處理的。我們也可以使用JDK提供的實現(xiàn)Cloneable接口,實現(xiàn)快速復制。

創(chuàng)建對象的四種方式:

new、反射、克隆、序列化

實際案例

大家是否有遇到過這種常見,就是項目中規(guī)定,不能把與數(shù)據(jù)庫表映射的entity類返回給前端,所以通常返回給前端的有各種O,比如:XxxVO、XxxBO、XxxDTO...

這時候就會出現(xiàn)下面的場景,大家也想已經(jīng)猜到了。

下面是與數(shù)據(jù)庫表映射的UserEntity

Wir k?nnen einige Getter und Setter in eine Factory-Methode kapseln und dann für den Benutzer einfach die Methode aufrufen, Es ist nicht erforderlich, zu wissen, wie die darin enthaltenen Getter und Setter gehandhabt werden. Wir k?nnen auch Implementierung bereitgestellt durch JDK

Vier M?glichkeiten zum Erstellen von Objekten:

new,flection, Clone, serialize??

Tats?chlicher Fall

??Jemand ist mir darauf begegnet H?ufiges Problem. Im Projekt ist festgelegt, dass die der Datenbanktabelle zugeordnete Entit?tsklasse nicht an das Frontend zurückgegeben werden kann. Daher werden normalerweise verschiedene O an das Frontend zurückgegeben, z. B.: XxxVO, XxxBO, XxxDTO ... ?? ??Zu diesem Zeitpunkt erscheint die folgende Szene, und jeder hat es vielleicht erraten. ????Das Folgende ist die Zuordnung zur Datenbanktabelle以下是代碼的實現(xiàn):

//用戶地址信息
public class UserAddress  implements Serializable{
    private String province;
    private String cityCode;

    public UserAddress(String province, String cityCode) {
        this.province = province;
        this.cityCode = cityCode;
    }
}
//用戶信息
public class User implements Cloneable {
    private int age;
    private String name;
    //用戶地址信息
    private UserAddress userAddress;

    //getter setter 省略

    @Override
    protected Object clone() throws CloneNotSupportedException { 
        return super.clone();
    }
}
//測試
public class UserTest {
    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setAge(20);
        user.setName("田維常");
        UserAddress userAddress = new UserAddress("貴州", "梵凈山");
        user.setUserAddress(userAddress);

        User clone = (User) user.clone();

        System.out.println("克隆前后UserAddress比較:" + (user.getUserAddress() == clone.getUserAddress()));
    }
}

輸出結(jié)果

克隆前后 UserAddress 比較:true

兩個對象屬性 UserAddress 指向的是同一個地址。

這就是所謂的淺克隆,只是克隆了對象,對于該對象的非基本類型屬性,仍指向原來對象的屬性所指向的對象的內(nèi)存地址。

關(guān)系如下:

Master-Prototyp-Modus in fünf Minuten


深克隆

關(guān)于深克隆,我們來用一個很經(jīng)典的案例,西游記里的孫悟空。一個孫悟空能變成n多個孫悟空,手里都會拿著一個金箍棒。

按照前面的淺克隆,結(jié)果就是:孫悟空倒是變成很多孫悟空,但是金箍棒用的是同一根。

深克隆的結(jié)果是:孫悟空變成了很多個,金箍棒也變成很多個根。

下面我們用代碼來實現(xiàn):

//猴子,有身高體重和生日
public class Monkey {
    public int height;
    public int weight;
    public Date birthday;
}

孫悟空也是猴子,兵器 孫悟空有個金箍棒:

import java.io.Serializable;
//孫悟空的金箍棒
public class JinGuBang implements Serializable{
    public float  h=100;
    public float  d=10;
    //金箍棒變大
    public void big(){
        this.h *=10;
        this.d *=10;
    }
    //金箍棒變小
    public void small(){
        this.h /=10;
        this.d /=10;
    }
}

齊天大圣孫悟空:

import java.io.*;
import java.util.Date;

//孫悟空有七十二變,拔猴毛生成一個金箍棒
//使用JDK的克隆機制,
//實現(xiàn)Cloneable并重寫clone方法
public class QiTianDaSheng extends Monkey implements Cloneable, Serializable {

    public JinGuBang jinGuBang;

    public QiTianDaSheng() {
        this.birthday = new Date();
        this.jinGuBang = new JinGuBang();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return this.deepClone();
    }

    //深克隆
    public QiTianDaSheng deepClone() {
        try {
            //內(nèi)存中操作完成、對象讀寫,是通過字節(jié)碼直接操作
            //與序列化操作類似
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream bis = new ObjectInputStream(bais);

            //完成一個新的對象,底層是使用new創(chuàng)建的一個對象
            //詳情可以了解readObject方法
            QiTianDaSheng qiTianDaSheng = (QiTianDaSheng) bis.readObject();
            //每個猴子的生日不一樣,所以每次拷貝的時候,把生日改一下
            qiTianDaSheng.birthday = new Date();
            return qiTianDaSheng;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    //淺克隆,就是簡單的賦值
    public QiTianDaSheng shalllowClone(QiTianDaSheng target) {
        QiTianDaSheng qiTianDaSheng = new QiTianDaSheng();
        qiTianDaSheng.height = target.height;
        qiTianDaSheng.weight = target.weight;

        qiTianDaSheng.jinGuBang = target.jinGuBang;
        qiTianDaSheng.birthday = new Date();
        return qiTianDaSheng;

    }
}

接著我們就來測試一下:

public class DeepCloneTest {
    public static void main(String[] args) {
        QiTianDaSheng qiTianDaSheng = new QiTianDaSheng();
        try {
            QiTianDaSheng newObject = (QiTianDaSheng) qiTianDaSheng.clone();
            System.out.print("深克隆后 ");
            System.out.println("金箍棒是否一直:" + (qiTianDaSheng.jinGuBang == newObject.jinGuBang));
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        QiTianDaSheng newObject=qiTianDaSheng.shalllowClone(qiTianDaSheng);
        System.out.print("淺克隆后 ");
        System.out.println("金箍棒是否一直:" + (qiTianDaSheng.jinGuBang == newObject.jinGuBang));
    }
}

輸出結(jié)果為:

深克隆后 金箍棒是否一直:false
淺克隆后 金箍棒是否一直:true

深克隆后每個孫悟空都有自己的金箍棒,而淺克隆后每個孫悟空用的金箍棒實質(zhì)上還是同一根。

Master-Prototyp-Modus in fünf Minuten

總結(jié)

切記:深和淺,指的是克隆對象里的屬性(引用類型)是否指向同一個內(nèi)存地址。

為了更深刻的理解深克隆和淺克隆,我們回答文中的簡歷拷貝的故事。

  • Tiefe Kopie: Kopieren Sie einen Lebenslauf und ?ndern Sie dann die Informationen im Lebenslauf, um ihn zu Ihrem eigenen zu machen.
  • Flache Kopie: Kopieren Sie einen Lebenslauf, und der Inhalt des Lebenslaufs bleibt v?llig unver?ndert.

Vorteile:

  • Der Java-Prototyp-Modus basiert auf dem Kopieren von Speicher-Bin?rstr?men, was eine bessere Leistung als direkt neu bietet.
  • Sie k?nnen Deep Cloning verwenden, um den Objektstatus zu speichern, eine alte Kopie zu speichern (klonen) und beim ?ndern als Rückg?ngig-Funktion zu fungieren.

Nachteile:

  • W?hrend der Transformation müssen vorhandene Klassen ge?ndert werden, was gegen das ??ffnungs- und Schlie?prinzip“ verst??t.
  • Wenn es mehrere verschachtelte Referenzen zwischen Objekten gibt, muss jede Ebene geklont werden.

Wir haben eine umfassende Erkl?rung des Prototypmusters anhand seiner Definition, Verwendungsszenarien, realen F?lle, flachem Klonen, tiefem Klonen, Vor- und Nachteilen usw. gegeben.

Das obige ist der detaillierte Inhalt vonMaster-Prototyp-Modus in fünf Minuten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276
Wie gehe ich mit Transaktionen in Java mit JDBC um? Wie gehe ich mit Transaktionen in Java mit JDBC um? Aug 02, 2025 pm 12:29 PM

Um JDBC -Transaktionen korrekt zu verarbeiten, müssen Sie zun?chst den automatischen Komiti -Modus ausschalten und dann mehrere Vorg?nge ausführen und schlie?lich entsprechend den Ergebnissen festlegen oder rollen. 1. Nennen Sie Conn.SetAutoCommit (False), um die Transaktion zu starten. 2. Führen Sie mehrere SQL -Operationen aus, z. B. einfügen und aktualisieren. 3. Rufen Sie Conn.Commit () an, wenn alle Vorg?nge erfolgreich sind, und rufen Sie Conn.Rollback () auf, wenn eine Ausnahme auftritt, um die Datenkonsistenz zu gew?hrleisten. Gleichzeitig sollten Try-with-Ressourcen verwendet werden, um Ressourcen zu verwalten, Ausnahmen ordnungsgem?? zu behandeln und Verbindungen zu schlie?en, um Verbindungsleckage zu vermeiden. Darüber hinaus wird empfohlen, Verbindungspools zu verwenden und Save -Punkte zu setzen, um teilweise Rollback zu erreichen und Transaktionen so kurz wie m?glich zu halten, um die Leistung zu verbessern.

Wie arbeite man mit Kalender in Java? Wie arbeite man mit Kalender in Java? Aug 02, 2025 am 02:38 AM

Verwenden Sie Klassen im Java.Time -Paket, um das alte Datum und die Kalenderklassen zu ersetzen. 2. Erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit durch LocalDate, LocalDatetime und Local Time; 3. Erstellen Sie ein bestimmtes Datum und eine bestimmte Uhrzeit mit der von () Methode; 4.. Verwenden Sie die Plus/Minus -Methode, um die Zeit nicht zu erh?hen und zu verkürzen. 5. Verwenden Sie ZonedDatetime und zoneId, um die Zeitzone zu verarbeiten. 6. Format und analysieren Sie Datumszeichenfolgen über DateTimeFormatter; 7. Verwenden Sie sofortige, um bei Bedarf mit den alten Datumstypen kompatibel zu sein. Die Verarbeitung der Datum in der modernen Java sollte der Verwendung von Java.Timeapi vorrangig machen, was klare, unver?nderliche und linear ist

Vergleich von Java Frameworks: Spring Boot vs Quarkus gegen Micronaut Vergleich von Java Frameworks: Spring Boot vs Quarkus gegen Micronaut Aug 04, 2025 pm 12:48 PM

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Gehen Sie zum Beispiel für HTTP Middleware -Protokollierung Gehen Sie zum Beispiel für HTTP Middleware -Protokollierung Aug 03, 2025 am 11:35 AM

HTTP-Protokoll Middleware in Go kann Anforderungsmethoden, Pfade, Client-IP und zeitaufw?ndiges Aufzeichnen aufzeichnen. 1. Verwenden Sie http.Handlerfunc, um den Prozessor zu wickeln, 2. Nehmen Sie die Startzeit und die Endzeit vor und nach dem Aufrufen als n?chstes auf. Der vollst?ndige Beispielcode wurde überprüft, um auszuführen und eignet sich zum Starten eines kleinen und mittelgro?en Projekts. Zu den Erweiterungsvorschl?gen geh?ren das Erfassen von Statuscodes, die Unterstützung von JSON -Protokollen und die Nachverfolgung von ID -IDs.

Wie funktioniert die Müllsammlung in Java? Wie funktioniert die Müllsammlung in Java? Aug 02, 2025 pm 01:55 PM

Die Müllsammlung von Java (GC) ist ein Mechanismus, der automatisch den Speicher verwaltet, der das Risiko eines Speicherlecks verringert, indem unerreichbare Objekte zurückgeführt werden. 1.GC beurteilt die Zug?nglichkeit des Objekts aus dem Stammobjekt (z. B. Stapelvariablen, aktive Threads, statische Felder usw.) und nicht erreichbare Objekte als Müll markiert. 2. Basierend auf dem markierten Algorithmus markieren Sie alle erreichbaren Objekte und l?schen Sie nicht markierte Objekte. 3.. Verfolgen Sie eine Generationskollektionsstrategie: Die neue Generation (Eden, S0, S1) führt h?ufig MollGC aus; Die ?lteren Menschen erzielen weniger, dauert jedoch l?nger, um MajorGC durchzuführen. MetaPace speichert Klassenmetadaten. 4. JVM bietet eine Vielzahl von GC -Ger?ten: SerialGC ist für kleine Anwendungen geeignet; ParallelgC verbessert den Durchsatz; CMS reduziert sich

Verwenden von HTML `Input` -Typen für Benutzerdaten Verwenden von HTML `Input` -Typen für Benutzerdaten Aug 03, 2025 am 11:07 AM

Durch die Auswahl des richtigen HTMlinput -Typs kann die Datengenauigkeit verbessert, die Benutzererfahrung verbessert und die Benutzerfreundlichkeit verbessert werden. 1. W?hlen Sie die entsprechenden Eingabetypen gem?? dem Datentyp aus, z. B. Text, E -Mail, Tel, Nummer und Datum, die automatisch überprüft und an die Tastatur anpassen k?nnen. 2. Verwenden Sie HTML5, um neue Typen wie URL, Farbe, Reichweite und Suche hinzuzufügen, die eine intuitivere Interaktionsmethode bieten k?nnen. 3.. Verwenden Sie Platzhalter und erforderliche Attribute, um die Effizienz und Genauigkeit der Formulierung zu verbessern. Es sollte jedoch beachtet werden, dass der Platzhalter das Etikett nicht ersetzen kann.

Vergleich von Java -Build -Werkzeugen: Maven vs. Gradle Vergleich von Java -Build -Werkzeugen: Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

GradleStheBetterChoiceFormostnewProjectsDuetoitSuperiorFlexibilit?t, Leistung und ModerntoolingSupport.1.GRADLE'SGROOVY/KOTLINDSLISMORECONCISEANDEIPRESSIVETHANMANMANBOSEXML.2.GRAGRECONCISEANDEPRPRESSIVETHANMAVENSVOSEXML.2.

Gehen Sie mit einer Beispielverschiebung erkl?rt Gehen Sie mit einer Beispielverschiebung erkl?rt Aug 02, 2025 am 06:26 AM

Auf Defer wird verwendet, um bestimmte Vorg?nge auszuführen, bevor die Funktion zurückgibt, z. B. die Reinigungsressourcen. Die Parameter werden sofort bewertet, wenn sie aufgeschoben werden, und die Funktionen werden in der Reihenfolge von Last-In-First-Out (LIFO) ausgeführt. 1. Mehrere Defers werden in umgekehrter Reihenfolge der Erkl?rungen ausgeführt. 2. h?ufig für die sichere Reinigung wie das Schlie?en von Dateien verwendet; 3. Der benannte Rückgabewert kann ge?ndert werden; V. 5. Vermeiden Sie den Missbrauch von Verschiebungen in Schleifen, um Ressourcenleckage zu verhindern. Die korrekte Verwendung kann die Sicherheit und die Lesbarkeit der Code verbessern.

See all articles