Maison  >  Article  >  Java  >  Modèles de conception Java-Modèle de générateur

Modèles de conception Java-Modèle de générateur

坏嘻嘻
坏嘻嘻original
2018-09-14 14:25:381235parcourir

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.

Origine

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.

Le but de l'utilisation de

est de dessiner une petite personne

1 Définir l'abstraction 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();
}

2. Définissez une 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);
    }
}

3. Définir une Directorclasse 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();
    }
}

4. Test

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 :

Modèles de conception Java-Modèle de générateur

Définition

Définition littérale

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.

Schéma structurel

Citation d'un diagramme de "Dahua Design Patterns"

Modèles de conception Java-Modèle de générateur

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.

Avantages

  1. 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.

  2. 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.

  3. 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.

Exemple

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 :

Modèles de conception Java-Modèle de générateur

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn