ホームページ  >  記事  >  Java  >  Java デザイン パターン - ビルダー パターン

Java デザイン パターン - ビルダー パターン

坏嘻嘻
坏嘻嘻オリジナル
2018-09-14 14:25:381279ブラウズ

この記事ではBuilderの使い方を中心に紹介します。皆さんの参考に共有してください。詳細は次のとおりです。

最近、Mybatis のソース コードを調べて、XML 設定ファイルを解析しているときに、次のことがわかりました。ビルダーモードが使用されました。そこで、このデザインパターンを見直す予定です。

起源

小さな人物を描く必要があると仮定すると、次のコンストラクター定義があるとします。

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

そのようなコンストラクターを見て、後で戻ってくると予想します。見たときは混乱しましたが、パラメータが多すぎてその後のメンテナンスが非常に面倒です。

このような問題を解決できるのが構築パターンです。

使用

目標は小さな人物を描くことです

1. 抽象を定義します Builder

最初に抽象を定義します パーソンビルダー 。このクラスは、悪役を描画するために必要な手順を定義するため、PersonBuilder を通じて生成される各オブジェクトは本質的に同じですが、異なる個性を持つことができます。

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. 特定の Builder クラス

を定義し、特定の実装クラス PersonFatBuilder を定義します。このクラスは PersonBuilder を継承し、抽象メソッドを実装します。

<pre class="brush:js;toolbar:false;">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); } }</pre>

3. 特定の Director クラスを定義します

このクラスは特定の構築プロセスを担当し、何が構築されるかは関係ありません。

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. テスト

ウィンドウを作成し、悪役を描きます。

 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();


                }
            });
        }
    });
}

結果は次のとおりです。

Java デザイン パターン - ビルダー パターン

定義

リテラル定義

次の構造を比較します。複雑なオブジェクトと表現の分離により、同じ構築プロセスで異なる表現を作成できます。

言い換えれば、コンストラクターの汚染を回避しながら、さまざまなタイプのオブジェクトを作成できるようになります。このパターンは、オブジェクトの種類が複数ある場合に便利です。あるいは、オブジェクトの作成には多くの手順が必要です。

構造図

「Dahua Design Pattern」から図を引用

Java デザイン パターン - ビルダー パターン

##抽象クラス

Builder: ##を作成#Productオブジェクトと抽象インターフェイス。 継承クラス

ConcreateBuilder

: 特定のビルダーは、さまざまなコンポーネントを構築およびアセンブルします。 特定の製品カテゴリ

製品

: 構築する必要があるオブジェクト。

Director

: 製品の作成に使用され、内部には Builder 型のメンバー変数があります。 利点

  1. #Director

    Productの内部詳細を知る必要はなく、必要な情報のみをビルダーに提供します。 , 特定のビルダー ConcreateBuilder によって処理されて、製品の構築が完了します。

  2. ビルダー パターンは、複雑な製品作成プロセスをさまざまなオブジェクトに分散することで、製品作成プロセスをより正確に制御し、作成プロセスをより明確にします。
  3. 特定の各ビルダーは完全な製品オブジェクトを作成でき、それは互いに独立しています。したがって、呼び出し元は、さまざまなコンクリート ビルダーを通じてさまざまなオブジェクトを取得できます。新しい製品が登場した場合、元のコードを変更する必要はなく、ビルダーを追加するだけで済みます。

次に、顔の特徴を備えた太った小柄な男性を作成したいとします。次に、

PersonFatBuilder

クラスを追加するだけでよく、元のコードを変更する必要はありません。 <pre class="brush:js;toolbar:false;">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); } }</pre>結果:

Java デザイン パターン - ビルダー パターン関連する推奨事項:


[oracleチュートリアル]Oracle Warehouse Builder 11g Relから始める

yii クエリ ビルダー (yii クエリ ビルダー) 公式ガイド翻訳

以上がJava デザイン パターン - ビルダー パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。