1定義
公式の定義:同じ構築プロセスで異なる表現を作成できるように、複雑なオブジェクトの構築をそれらの表現から分離します。
オブジェクトを作成するときは、多くの手順が必要であり、これらの手順は基本的に変更されていないことを個人的に理解しています。たとえば、図、胴体、手足、頭、頭に7つの開口部を描く、人の基本的な構成は固定されています。ステップをビルダーインターフェイスまたは抽象クラスに抽象化します。このオブジェクトを生成するには、ビルダーに渡してビルドします。ビルダーはそれを直接取得して表現できます。
2構造と実装
ビルダーパターンの構造図は次のとおりです。
ビルダーモードは、製品、抽象ビルダー、コンクリートビルダー、コンダクターの4つの要素で構成されます。次のコードのセクション6.2で説明されているように、司令官は時々できないことがあります。
Builderモードの主な役割は次のとおりです。
1.製品:複数のコンポーネントを含む複雑なオブジェクトであり、各コンポーネントは特定のビルダーによって作成されます。
2. Abstract Builder(Builder):製品のさまざまなサブコンポーネントを作成するための抽象メソッドを含むインターフェースであり、通常、複雑な製品(Product)を返すメソッドgetProduct()も含まれています。
3.コンクリートビルダー:ビルダーインターフェイスを実装して、複雑な製品の各コンポーネントの特定の作成方法を完了します。
4.ディレクター(ディレクター):ビルダーオブジェクトのコンポーネント構築メソッドとアセンブリメソッドを呼び出して、複雑なオブジェクトの作成を完了します。ディレクターに特定の製品情報は含まれません。
3長所と短所
3.1利点
1.優れたカプセル化、構造とプレゼンテーションの分離。
2.優れたスケーラビリティ、各特定のビルダーは互いに独立しており、システムの分離に役立ちます。
3.クライアントは製品の内部構成の詳細を知る必要がなく、ビルダーは他のモジュールに影響を与えることなく作成プロセスを徐々に洗練することができ、詳細のリスクを制御するのに便利です。
3.2デメリット
1.製品のコンポーネントは同じである必要があり、その使用範囲が制限されます。
2.製品の内部変更が複雑な場合、製品の内部変更が発生した場合、ビルダーも同時に変更する必要があり、後期の維持費が比較的高くなります。
4該当するシナリオ
1.同じメソッド、異なる実行順序は、異なる結果を生成します。
2.複数のコンポーネントまたはパーツをオブジェクトに組み立てることができますが、結果は同じではありません。
3.製品クラスが非常に複雑であるか、製品クラスの呼び出しシーケンスが異なると効果も異なります。
4.オブジェクトの初期化は特に複雑で、多くのパラメーターがあり、多くのパラメーターにはデフォルト値があります。
5ビルダーパターンとファクトリパターンの違い
ビルダーパターンとファクトリパターンの唯一の違いは、複雑なオブジェクトの作成です。つまり、単純なオブジェクトを作成する場合は、通常、ファクトリパターンを使用してオブジェクトを作成し、複雑なオブジェクトを作成する場合は、ビルダーパターンの使用を検討できます。
具体的には、次の違いがあります。
1.ビルダーパターンはメソッドの呼び出しシーケンスにより多くの注意を払い、ファクトリパターンはオブジェクトの作成に焦点を合わせます。
2.オブジェクトの作成の強さは異なります。ビルダーモードでは、さまざまな複雑なコンポーネントで構成される複雑なオブジェクトが作成されます。ファクトリモードで作成されるオブジェクトはすべて同じです。
3.フォーカスが異なります。ファクトリパターンはオブジェクトを作成するだけでよく、ビルダーパターンはオブジェクトを作成するだけでなく、オブジェクトがどのコンポーネントで構成されているかも知っています。
4.ビルダーモードは、構築プロセスの順序によって異なり、最終的なオブジェクトコンポーネントも異なります。
6コード例
コード例には2つの部分が含まれ、1つはディレクター、ビルダー、および製品によって形成されるビルダーパターンであり、もう1つは静的内部クラスによる無秩序なアセンブリのパーツの構築です。
6.1ディレクター、ビルダー、製品によって形成されたビルダーパターン
コンピューター(製品)の組み立て、マザーボード、CPU、メモリ、ハードディスク、ケースシェル、5つのステップがあり、Foxconnが組み立てを担当し、Lenovoが司令官であり、Foxconnからコンピューターを購入する必要はありませんがLenovoに。
6.1.1コンピューター製品コンピューター
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 11:08
**/
public class Computer {
List<String> components = new ArrayList<>();
public void show(){
System.out.println("computer include: ");
for (String s: components) {
System.out.println(s);
}
}
}
6.1.2コンピューター抽象インターフェースComputerBuilderのアセンブル
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 11:11
**/
public interface ComputerBuilder {
/**
* 组装主板
*/
void constructBoard();
/**
* 组装cpu
*/
void constructCpu();
/**
* 组装内存条
*/
void constructMemory();
/**
* 组装硬盘
*/
void constructHardDisk();
/**
* 组长机箱壳
*/
void constructCase();
/**
* 返回电脑成品
* @return 电脑
*/
Computer getComputer();
}
6.1.3特定のビルダーFoxconnビルダー
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 11:20
**/
public class FoxconnBuilder implements ComputerBuilder{
private Computer computer = new Computer();
@Override
public void constructBoard() {
computer.components.add("lenovo board");
}
@Override
public void constructCpu() {
computer.components.add("lenovo cpu");
}
@Override
public void constructMemory() {
computer.components.add("lenovo memory");
}
@Override
public void constructHardDisk() {
computer.components.add("lenovo hard disk");
}
@Override
public void constructCase() {
computer.components.add("lenovo case");
}
@Override
public Computer getComputer(){
return computer;
}
}
6.1.4LenovoディレクターLenovoディレクター
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 11:31
**/
public class LenovoDirector {
private ComputerBuilder computerBuilder;
public LenovoDirector(ComputerBuilder computerBuilder){
this.computerBuilder = computerBuilder;
}
public Computer getComputer(){
computerBuilder.constructBoard();
computerBuilder.constructCpu();
computerBuilder.constructMemory();
computerBuilder.constructHardDisk();
computerBuilder.constructCase();
return computerBuilder.getComputer();
}
}
6.1.5主な機能
public class MainClass {
public static void main(String[] args) {
LenovoDirector lenovoDirector = new LenovoDirector(new FoxconnBuilder());
Computer computer = lenovoDirector.getComputer();
computer.show();
}
}
6.1.6実行結果
6.2静的内部クラスメソッドは、部品の故障したアセンブリの構造を実現します
携帯電話(製品)の組み立て、マザーボード、CPU、ストレージ、携帯電話ケースの4つのステップがあり、ビルダーのQuantaが組み立てを担当します。アップルは、携帯電話を入手するために商品を受け取るようにQuantaに直接依頼します。 Quantaは携帯電話を4つのステップで組み立てます。必要に応じて交換できます。
6.2.1携帯電話製品電話
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 11:08
**/
public class Telephone {
List<String> components = new ArrayList<>();
public void show(){
System.out.println("telephone include: ");
for (String s: components) {
System.out.println(s);
}
}
}
6.2.2携帯電話の抽象インターフェースTelephoneBuilderの組み立て
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 12:06
**/
public interface TelephoneBuilder {
/**
* 组装主板
* @return 手机构建者
*/
TelephoneBuilder constructBoard();
/**
* 组装cpu
* @return 手机构建者
*/
TelephoneBuilder constructCpu();
/**
* 组装存储
* @return 手机构建者
*/
TelephoneBuilder constructMemory();
/**
* 组长手机壳
* @return 手机构建者
*/
TelephoneBuilder constructCase();
/**
* 返回电脑成品
* @return 电脑
*/
Telephone getTelephone();
}
6.2.3 QuantaBuilder
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 12:04
**/
public class QuantaBuilder implements TelephoneBuilder{
private Telephone telephone;
public QuantaBuilder(){
this.telephone = new Telephone();
}
@Override
public TelephoneBuilder constructBoard() {
telephone.components.add("apple board");
return this;
}
@Override
public TelephoneBuilder constructCpu() {
telephone.components.add("apple cpu");
return this;
}
@Override
public TelephoneBuilder constructMemory() {
telephone.components.add("apple memory");
return this;
}
@Override
public TelephoneBuilder constructCase() {
telephone.components.add("apple case");
return this;
}
@Override
public Telephone getTelephone() {
return telephone;
}
}
6.2.4主な機能
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-09-26 11:08
**/
public class MainClass {
public static void main(String[] args) {
QuantaBuilder quantaBuilder = new QuantaBuilder();
Telephone telephone = quantaBuilder.
constructBoard()
.constructMemory()
.constructCpu()
.constructCase()
.getTelephone();
telephone.show();
}
}
6.2.5実行結果
6.3まとめ
コードの実装は2つあります。1つ目は、構築ステップが変更されていない場合に適したコマンダーを備えています。2つ目は、静的内部クラスの柔軟な実装であり、各ステップのシーケンスに特別な要件はありません。 。
7引用
1.「Dahuaデザインパターン」
4.Javaデザインパターン-ビルダーパターン