この記事ではBuilderの使い方を中心に紹介します。皆さんの参考に共有してください。詳細は次のとおりです。
最近、Mybatis
のソース コードを調べて、XML
設定ファイルを解析しているときに、次のことがわかりました。ビルダーモードが使用されました。そこで、このデザインパターンを見直す予定です。
小さな人物を描く必要があると仮定すると、次のコンストラクター定義があるとします。
public Person(HeadType headType, HairType hairType, HairColor hairColor, FaceType faceType, BodyType bodyType, ArmType amrType, LegType legTyype) { }
そのようなコンストラクターを見て、後で戻ってくると予想します。見たときは混乱しましたが、パラメータが多すぎてその後のメンテナンスが非常に面倒です。
このような問題を解決できるのが構築パターンです。
目標は小さな人物を描くことです
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(); }
Builder
クラス を定義し、特定の実装クラス PersonFatBuilder
を定義します。このクラスは PersonBuilder
を継承し、抽象メソッドを実装します。
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(); } }
ウィンドウを作成し、悪役を描きます。
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(); } }); } }); }
結果は次のとおりです。
次の構造を比較します。複雑なオブジェクトと表現の分離により、同じ構築プロセスで異なる表現を作成できます。
言い換えれば、コンストラクターの汚染を回避しながら、さまざまなタイプのオブジェクトを作成できるようになります。このパターンは、オブジェクトの種類が複数ある場合に便利です。あるいは、オブジェクトの作成には多くの手順が必要です。
「Dahua Design Pattern」から図を引用
##抽象クラスBuilder: ##を作成#Product
オブジェクトと抽象インターフェイス。 継承クラス
: 特定のビルダーは、さまざまなコンポーネントを構築およびアセンブルします。 特定の製品カテゴリ
: 構築する必要があるオブジェクト。
: 製品の作成に使用され、内部には Builder
型のメンバー変数があります。 利点
Product
の内部詳細を知る必要はなく、必要な情報のみをビルダーに提供します。 , 特定のビルダー ConcreateBuilder
によって処理されて、製品の構築が完了します。
クラスを追加するだけでよく、元のコードを変更する必要はありません。 <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 デザイン パターン - ビルダー パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。