Cet article présente principalement l'utilisation de Builder. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :
J'ai récemment regardé le code source de Mybatis
En train de lire et d'analyser le fichier de configuration XML
, j'ai découvert que le mode constructeur était utilisé. Par conséquent, je prévois de revoir ce modèle de conception.
Supposons que nous ayons besoin de dessiner une petite personne, nous pouvons avoir la définition de constructeur suivante :
public Person(HeadType headType, HairType hairType, HairColor hairColor, FaceType faceType, BodyType bodyType, ArmType amrType, LegType legTyype) { }
En voyant un tel constructeur, nous avons probablement Quand je suis revenu En y regardant à l'avenir, j'étais confus. Il y avait tellement de paramètres qui rendaient la maintenance ultérieure très pénible pour nous.
Le modèle de construction peut résoudre de tels problèmes.
est de dessiner une petite personne
Builder
Définir d'abord l'abstraction PersonBuilder
. Cette classe définit les étapes nécessaires pour dessiner un méchant, de sorte que chaque objet généré via PersonBuilder
soit essentiellement le même, mais puisse avoir des personnalités différentes.
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
classe spécifique avant de définir une classe d'implémentation spécifique PersonFatBuilder
. Cette classe hérite de PersonBuilder
et implémente des méthodes abstraites.
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
classe spécifique Cette classe est responsable du processus de construction spécifique et ne se soucie pas de ce qui est construit.
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(); } }
Créez une fenêtre et dessinez le méchant.
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(); } }); } }); }
Les résultats sont les suivants :
Construction de objets complexes La séparation de sa représentation permet au même processus de construction de créer des représentations différentes.
Autrement dit, cela permet de créer différents types d'objets tout en évitant la pollution du constructeur. Ce modèle est utile lorsqu'il existe plusieurs types d'objets. Ou bien la création d’un objet comporte de nombreuses étapes.
Citation d'un diagramme de "Dahua Design Patterns"
Classe abstraiteBuilder
: Pour créer des Product
objets Et interface abstraite.
Classe héritéeConcreateBuilder
: constructeur spécifique, construit et assemble divers composants.
Catégorie de produit spécifiqueProduct
: L'objet que nous devons construire.
Director
: utilisé pour créer des produits, il contient des variables membres de type Builder
.
Director
Pas besoin de connaître les détails internes de Product
, il fournit uniquement les informations nécessaires au constructeur, par le constructeur spécifique ConcreateBuilder
transformation pour compléter la construction du produit.
Le mode Constructeur disperse le processus complexe de création de produit en différents objets, obtenant ainsi un contrôle plus précis sur le processus de création de produit et rendant le processus de création plus clair.
Chaque constructeur spécifique peut créer un objet produit complet et est indépendant les uns des autres. Par conséquent, l’appelant peut obtenir différents objets via différents constructeurs concrets. Lorsqu'un nouveau produit apparaît, il n'est pas nécessaire de modifier le code d'origine, il suffit d'ajouter un constructeur.
Maintenant, si nous voulons construire un gros petit homme avec des traits du visage. Ensuite, il suffit d'ajouter une classe PersonFatBuilder
, et il n'est pas nécessaire de modifier le code d'origine.
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); } }
Résultat :
Recommandations associées :
[tutoriel Oracle] Démarrer avec Oracle Warehouse Builder 11g Rel
yii Query Builder (yii Query Builder) Traduction du guide officiel
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!