Prototypmuster und seine Beispiele


Vorwort

Das Prototypmuster ist ein Schöpfungsmuster unter den 23 Entwurfsmustern:
Ein Schöpfungsmuster ist eine Art Entwurfsmuster, das zum Erstellen von Objekten und Mechanismen verwendet wird. Sie bieten eine flexible Möglichkeit, Objekte zu instanziieren und gleichzeitig die Details der Objekterstellung zu verbergen, wodurch Code wartbarer, erweiterbarer und wiederverwendbar wird.


1. Prototyp-Modus

Die Verwendung von Prototypmustern ist ein effektives Entwurfsmuster, wenn wir mehrere ähnliche Objekte erstellen müssen. Das Prototypmuster erstellt neue Objekte durch Klonen vorhandener Objekte, vermeidet wiederholte Objekterstellungsprozesse und verbessert die Leistung und Wartbarkeit des Codes. In der Softwareentwicklung stoßen wir häufig auf Situationen, in denen wir eine große Anzahl ähnlicher Objekte erstellen müssen. Die traditionelle Methode zum Erstellen von Objekten besteht darin, neue Objekte durch den Aufruf von Konstruktoren zu instanziieren, was beim Erstellen komplexer Objekte zu Leistungsproblemen führen kann. Darüber hinaus kann die Parameterliste eines Konstruktors lang werden, was die Pflege und das Verständnis des Codes erschwert. Prototypmuster bieten eine Lösung, indem sie neue Objekte auf der Grundlage vorhandener Objekte erstellen, ohne Konstruktoren und Initialisierungsparameter durchlaufen zu müssen.

Funktionsweise:
Ein Objekt dient als Prototyp, durch Kopieren (Klonen) entstehen neue Objekte. In Java können Sie Vorgänge zum Klonen von Objekten implementieren, indem Sie die Schnittstelle Cloneable implementieren und die Methode clone() überschreiben.

Fügen Sie hier eine Bildbeschreibung ein

2. Flache Kopie und tiefe Kopie

1. Flache Kopie

**Flache Kopie: **Flache Kopie erstellt ein Klonobjekt und kopiert die Feldwerte des Originalobjekts. Wenn es sich bei dem Feld um einen Werttyp handelt, wird sein Wert kopiert. Wenn es sich bei dem Feld um einen Referenztyp handelt, wird die Referenz kopiert, sodass das ursprüngliche und das geklonte Objekt dasselbe Referenzobjekt verwenden. Es besteht eine bestimmte Beziehung zwischen dem Klonobjekt der flachen Kopie und dem Originalobjekt. Beide teilen sich die gleiche Adresse und es wird keine neue Speicheradresse geöffnet.

2. Tiefe Kopie

Deep Copy: Deep Copy
erstellt ein Klonobjekt und kopiert die Feldwerte des Originalobjekts, einschließlich des Referenzobjekts. Deep Copy kopiert das Referenzobjekt rekursiv, sodass das Originalobjekt und das geklonte Objekt völlig unabhängig sind und sich nicht gegenseitig beeinflussen. Es ähnelt eher dem Erstellen eines neuen Objekts und dem Zuweisen der Eigenschaften des Originalobjekts zum neuen Objekt. Das neue Objekt verfügt über eine eigene Speicheradresse und ist vom Originalobjekt unabhängig.

3. Codebeispiele

1. Adressklasse
Es ist ein Attribut der Personenklasse

public class Address {
    private String city;

    public Address(String city) {
        this.city = city;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

2. Experimentelles Objekt der Personenklasse
, implementiert Cloneable und überschreibt die Klonmethode

public class Person implements Cloneable{
    private String name;
    private Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

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

3. Testklasse
In der folgenden Testklasse werden Klonobjekte mit zwei verschiedenen Methoden erstellt: flache Kopie und tiefe Kopie, und dann mit dem Originalobjekt verglichen, um die Unterschiede zwischen den beiden Methoden zu vergleichen.
Vergleich zwischen dem flachen Klonobjekt und dem Originalobjekt: wahr, die beiden Adressen sind gleich und der Inhalt ist gleich.
Vergleich zwischen dem modifizierten flachen Klonobjekt und dem Originalobjekt: wahr, dieselbe Adresse und Änderungen gleichzeitig Zeit nach der Änderung.
Vergleich zwischen dem Deep-Clone-Objekt und dem Originalobjekt: false, die Werte sind gleich, aber die Adressen sind unterschiedlich, daher wird == falsch beurteilt.
Vergleichen Sie das geänderte Deep-Clone-Objekt mit dem Originalobjekt: false Da die Adressen unterschiedlich sind, ist die Änderung für das Originalobjekt ungültig.
Hinweis: == vergleicht Werte und Adressen, equal vergleicht nur deren Werte.

public class PrototypeExample {
    public static void main(String[] args) throws CloneNotSupportedException {
        Address address = new Address("New York");
        Person person1 = new Person("John", address);

        // 浅拷贝
        Person person2 = (Person) person1.clone();
        System.out.println("浅拷贝地址相同:" + (person1.getAddress() == person2.getAddress()));

        // 修改person2的地址
        person2.getAddress().setCity("Los Angeles");
        System.out.println("浅拷贝地址同时改变:" + (person1.getAddress().getCity().equals(person2.getAddress().getCity())));

        // 深拷贝
        Person person3 = new Person(person1.getName(), new Address(person1.getAddress().getCity()));
        System.out.println("深拷贝地址不同:" + (person1.getAddress() == person3.getAddress()));

        // 修改person3的地址
        person3.getAddress().setCity("San Francisco");
        System.out.println("深拷贝地址独立:" + (person1.getAddress().getCity().equals(person3.getAddress().getCity())));
    }
}

Zusammenfassen

Prototypenmuster ist ein Erstellungsmuster, das neue Objekte durch Kopieren vorhandener Objekte erstellt. Es bietet eine flexible und effiziente Möglichkeit zum Erstellen von Objekten, wodurch die Leistung und die Wartbarkeit des Codes in Szenarien verbessert werden können, die eine große Anzahl ähnlicher Objekte erfordern. Durch die Verwendung flacher oder tiefer Kopien kann das Prototypmuster Objekte flexibel klonen, sodass die neuen Objekte unabhängig von den Originalobjekten sind.

Ich denke du magst

Origin blog.csdn.net/a545__27/article/details/132266664
Empfohlen
Rangfolge