Heim > Java > javaLernprogramm > Hauptteil

Java-Entwurfsmuster – Builder-Muster

坏嘻嘻
Freigeben: 2018-09-14 14:25:38
Original
1248 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich die Verwendung von Builder vorgestellt. Teilen Sie es als Referenz mit allen. Die Details sind wie folgt:

Ich habe mir kürzlich den Quellcode von Mybatis angesehen. Beim Lesen und Parsen der XML-Konfigurationsdatei habe ich festgestellt, dass der Builder-Modus verwendet wurde. Daher habe ich vor, dieses Entwurfsmuster zu überprüfen.

Ursprung

Angenommen, wir müssen eine kleine Person zeichnen, dann haben wir möglicherweise die folgende Konstruktordefinition:

public Person(HeadType headType, HairType hairType, HairColor hairColor, FaceType faceType, BodyType bodyType, ArmType amrType, LegType legTyype) {
}
Nach dem Login kopieren

Wenn wir so einen Konstruktor sehen, werden wir wohl später noch einmal darauf zurückkommen. Ich war verwirrt, als ich es sah. Es gibt so viele Parameter, dass die spätere Wartung für uns sehr mühsam ist.

Das Konstruktionsmuster kann solche Probleme lösen.

Das Ziel der Verwendung von

besteht darin, eine kleine Person zu zeichnen

1. Definieren Sie die Abstraktion Builder

Definieren Sie zunächst die Abstraktion PersonBuilder. Diese Klasse definiert die Schritte, die zum Zeichnen eines Bösewichts erforderlich sind, sodass jedes durch PersonBuilder generierte Objekt im Wesentlichen gleich ist, aber unterschiedliche Persönlichkeiten haben kann.

abstract class PersonBuilder {
    protected Graphics graphics;

    public PersonBuilder(Graphics graphics) {
        this.graphics = graphics;
    }

    public abstract void buildHead();
    public abstract void buildBody();
    public abstract void buildArmLeft();
    public abstract void buildArmRight();
    public abstract void buildLegLeft();
    public abstract void buildLegRight();
}
Nach dem Login kopieren

2. Definieren Sie eine bestimmte Builder Klasse

, bevor Sie eine bestimmte Implementierungsklasse PersonFatBuilder definieren. Diese Klasse erbt PersonBuilder und implementiert abstrakte Methoden.

public class PersonFatBuilder extends PersonBuilder {
    public PersonFatBuilder(Graphics graphics) {
        super(graphics);
    }
    @Override
    public void buildHead() {
        graphics.drawOval(50, 20, 30, 30);
        graphics.drawArc(50, 30, 10, 5, 45, 135);
        graphics.drawArc(70, 30, 10, 5, 45, 135);
        graphics.drawArc(60, 35, 10, 5, 200, 135);
    }

    @Override
    public void buildBody() {
        graphics.drawRect(55, 50, 20, 50);
    }

    @Override
    public void buildArmLeft() {
        graphics.drawLine(55, 50, 40, 100);
    }

    @Override
    public void buildArmRight() {
        graphics.drawLine(75, 50, 90, 100);
    }

    @Override
    public void buildLegLeft() {
        graphics.drawLine(55, 100, 45, 150);
    }

    @Override
    public void buildLegRight() {
        graphics.drawLine(75, 100, 85, 150);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

3. Definieren Sie eine bestimmte DirectorKlasse

Diese Klasse ist für den spezifischen Bauprozess verantwortlich und kümmert sich nicht darum, was gebaut wird.

public class PersonDirector {
    private PersonBuilder personBuilder;

    public PersonDirector(PersonBuilder personBuilder) {
        this.personBuilder = personBuilder;
    }

    public void drawPerson() {
        personBuilder.buildHead();
        personBuilder.buildBody();
        personBuilder.buildArmLeft();
        personBuilder.buildArmRight();
        personBuilder.buildLegLeft();
        personBuilder.buildLegRight();
    }
}
Nach dem Login kopieren

4. Testen Sie

Erstellen Sie ein Fenster und zeichnen Sie den Bösewicht.

 public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            // 创建窗口对象
            JFrame frame = new JFrame();
            frame.setVisible(true);
            frame.setTitle("画人");
            frame.setSize(250, 300);

            // 设置窗口关闭按钮的默认操作(点击关闭时退出进程)
            frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

            // 把窗口位置设置到屏幕的中心
            frame.setLocationRelativeTo(null);
            frame.setContentPane(new JPanel(){
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    PersonThinBuilder thinBuilder = new PersonThinBuilder(g);
                    PersonDirector director = new PersonDirector(thinBuilder);
                    director.drawPerson();


                }
            });
        }
    });
}
Nach dem Login kopieren

Die Ergebnisse sind wie folgt:

Java-Entwurfsmuster – Builder-Muster

Definition

Wörtliche Definition

Verbinden Sie die Konstruktion von Komplexe Objekte mit der Trennung von Darstellungen ermöglichen es, mit demselben Konstruktionsprozess unterschiedliche Darstellungen zu erstellen.

Mit anderen Worten, es ermöglicht Ihnen, verschiedene Arten von Objekten zu erstellen und gleichzeitig eine Verschmutzung des Konstrukteurs zu vermeiden. Dieses Muster ist nützlich, wenn mehrere Objekttypen vorhanden sind. Oder es sind viele Schritte erforderlich, um ein Objekt zu erstellen.

Strukturdiagramm

Zitieren eines Diagramms aus „Dahua Design Patterns“

Java-Entwurfsmuster – Builder-Muster

Abstrakte KlasseBuilder: Zum Erstellen von Product Objekten Und abstrakte Schnittstelle.

Geerbte KlasseConcreateBuilder: spezifischer Builder, konstruiert und montiert verschiedene Komponenten.

Spezifische ProduktkategorieProduct: Das Objekt, das wir bauen müssen.

Director: Wird zum Erstellen von Produkten verwendet und enthält Mitgliedsvariablen vom Typ Builder.

Vorteile

  1. Director Es ist nicht erforderlich, die internen Details von Product zu kennen, es stellt dem Builder nur die benötigten Informationen durch den jeweiligen Builder bereit ConcreateBuilder Verarbeitung zur Vervollständigung der Konstruktion des Produkts.

  2. Der Builder-Modus verteilt den komplexen Produkterstellungsprozess auf verschiedene Objekte, wodurch eine präzisere Kontrolle über den Produkterstellungsprozess erreicht und der Erstellungsprozess klarer gestaltet wird.

  3. Jeder spezifische Builder kann ein vollständiges Produktobjekt erstellen und ist unabhängig voneinander. Daher kann der Anrufer über verschiedene Betonbauer unterschiedliche Objekte erhalten. Wenn ein neues Produkt erscheint, muss der ursprüngliche Code nicht geändert werden. Fügen Sie einfach einen Builder hinzu.

Beispiel

Wenn wir nun einen dicken kleinen Mann mit Gesichtszügen bauen wollen. Dann müssen wir nur noch eine PersonFatBuilder-Klasse hinzufügen und den ursprünglichen Code nicht ändern.

public class PersonFatBuilder extends PersonBuilder {
    public PersonFatBuilder(Graphics graphics) {
        super(graphics);
    }
    @Override
    public void buildHead() {
        graphics.drawOval(50, 20, 30, 30);
        graphics.drawArc(50, 30, 10, 5, 45, 135);
        graphics.drawArc(70, 30, 10, 5, 45, 135);
        graphics.drawArc(60, 35, 10, 5, 200, 135);
    }

    @Override
    public void buildBody() {
        graphics.drawRect(55, 50, 20, 50);
    }

    @Override
    public void buildArmLeft() {
        graphics.drawLine(55, 50, 40, 100);
    }

    @Override
    public void buildArmRight() {
        graphics.drawLine(75, 50, 90, 100);
    }

    @Override
    public void buildLegLeft() {
        graphics.drawLine(55, 100, 45, 150);
    }

    @Override
    public void buildLegRight() {
        graphics.drawLine(75, 100, 85, 150);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

Ergebnis:

Java-Entwurfsmuster – Builder-Muster

Verwandte Empfehlungen:

[Oracle-Tutorial] Beginnend mit Oracle Warehouse Builder 11g Rel

yii Query Builder (yii Query Builder) Offizielle Anleitungsübersetzung

Das obige ist der detaillierte Inhalt vonJava-Entwurfsmuster – Builder-Muster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!