家を建てる必要があるとします: そのプロセスは、杭を打ち、壁を作り、蓋をすることです。住宅には一般住宅、高層ビル、別荘など様々な種類がありますが、どの住宅でも手順は同じですが、要件は同じではありません 3) 要件を満たせるプログラムを書いてください。
従来の考え方は、次のクラス図の形式である必要があります。 .
#この書き方の利点は、理解しやすく、操作しやすいことです。
欠点は、設計されたプログラム構造が単純すぎること、キャッシュ層オブジェクトが設計されていないこと、プログラムを適切に拡張および保守できないことです。つまり、この設計スキームは、製品(つまり、住宅)とその製品を生み出すプロセス(つまり、住宅建設プロセス)をカプセル化しており、その結合が強化されています。
解決策: 製品と製品構築プロセスを分離 => ビルダー パターン。
ビルダー パターン (ビルダー パターン) は、ジェネレーター パターンとも呼ばれ、オブジェクト構築パターンです。複雑なオブジェクト (抽象カテゴリ) の構築プロセスを抽象化し、さまざまな実装方法を抽象化できます。
ビルダー パターンでは、複雑なオブジェクトを段階的に作成します。これにより、ユーザーは複合オブジェクトのタイプのみを指定できます。オブジェクトとコンテンツは、ユーザーが内部の具体的な構築の詳細を知る必要がなくても構築できます。
package com.szh.builder; public class House { private String basic; private String wall; private String roof; //setter and getter }
package com.szh.builder; //抽象的建造者 public abstract class HouseBuilder { protected House house = new House(); //将建造的流程写好, 抽象的方法 public abstract void buildBasic(); public abstract void buildWall(); public abstract void buildRoof(); //建造房子好, 将产品(房子)返回 public House buildHouse() { return house; } }
package com.szh.builder; public class CommonHouse extends HouseBuilder { @Override public void buildBasic() { System.out.println(" 普通房子打地基5m.... "); } @Override public void buildWall() { System.out.println(" 普通房子砌墙10cm.... "); } @Override public void buildRoof() { System.out.println(" 普通房子添加屋顶.... "); } }
package com.szh.builder; public class HighHouse extends HouseBuilder { @Override public void buildBasic() { System.out.println(" 高楼打地基100m.... "); } @Override public void buildWall() { System.out.println(" 高楼砌墙20cm.... "); } @Override public void buildRoof() { System.out.println(" 高楼添加透明屋顶.... "); } }
package com.szh.builder; //指挥者,这里去指定制作流程,返回产品 public class HouseDirector { HouseBuilder houseBuilder; //构造器传入 houseBuilder public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //通过setter传入 houseBuilder public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //如何处理建造房子的流程,交给指挥者 public House constructHouse() { houseBuilder.buildBasic(); houseBuilder.buildWall(); houseBuilder.buildRoof(); return houseBuilder.buildHouse(); } }
package com.szh.builder; public class MainTest { public static void main(String[] args) { //盖普通房子 CommonHouse commonHouse = new CommonHouse(); //准备创建房子的指挥者 HouseDirector houseDirector = new HouseDirector(commonHouse); //完成盖房子,返回产品(普通房子) houseDirector.constructHouse(); System.out.println("--------------------------"); //盖高楼 HighHouse highHouse = new HighHouse(); //重置建造者 houseDirector.setHouseBuilder(highHouse); //完成盖房子,返回产品(高楼) houseDirector.constructHouse(); } }
##3.JDK のビルダー パターン
##StringBuilder クラス、その親クラス、実装されている関連インターフェイスを見てみましょう。##Appendable インターフェイスは複数の追加メソッドを定義します (抽象メソッド)、つまり、Appendable は抽象ビルダーであり、抽象メソッドを定義します。
AbstractStringBuilder は Appendable インターフェイス メソッドを実装します。ここでの AbstractStringBuilder はすでにビルダーですが、インスタンス化できません。ビルダー モードで作成された製品は、一般に共通点が多く、コンポーネントも似ていますが、製品間の差異が大きい場合は、ビルダー モードの使用には適さないため、ビルダー モードを使用します。範囲には一定の制限があります。
製品の内部変更が複雑な場合、そのような変更を実装するために多くの特定のビルダー クラスを定義する必要が生じ、システムが非常に大きくなる可能性があります。この場合、ビルダーモードを選択するかどうかを検討する必要があります。
抽象ファクトリ パターンは、製品ファミリの作成を実装します。製品ファミリは、異なる分類次元を持つ製品の組み合わせである一連の製品です。抽象ファクトリ パターンを使用すると、どの製品がどの工場で生産されているかに注目してください。ビルダー モードでは、指定された設計図に従って製品を構築する必要があり、スペアパーツを組み合わせて新しい製品を生産することが主な目的です。
以上がJavaビルダーパターンとはの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。