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.
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) { }
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.
besteht darin, eine kleine Person zu zeichnen
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(); }
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); } }
Director
Klasse 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(); } }
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(); } }); } }); }
Die Ergebnisse sind wie folgt:
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.
Zitieren eines Diagramms aus „Dahua Design Patterns“
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
.
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.
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.
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.
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); } }
Ergebnis:
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!