目次
ビルダーモード
平たく言うと、たとえば、コンピューターを組み立てる場合、シャーシ、モニター、キーボード、およびマウスが必要ですが、選択するブランドは異なり、最終的なコンピューターの価格とパフォーマンスは大きく異なります。
同じアクセサリに基づくさまざまなアセンブリによって生成される特定のコンテンツは、ビルダー パターンの特定の実装です。つまり、複雑なオブジェクトの構築と表現が分離されているため、同じ構築プロセスでさまざまな表現を作成できます。
ビルダーパターンの構造
1. 抽象ビルダー (ビルダー)
これは、製品オブジェクトの各部分を作成するために指定された抽象インターフェースを宣言し、一般に 2 種類のメソッドが宣言されます。メソッドは getResult( ) であり、複雑なオブジェクトを返すために使用されます。Builder は、抽象クラスまたはインターフェースのいずれかです。
2.コンクリートビルダー
抽象ビルダー インターフェイスを実装し、さまざまなコンポーネントを構築して組み立て、それが作成する複雑なオブジェクトを定義および明確にし、作成された複雑な製品オブジェクトを返すメソッドも提供します。
3. ディレクター
複雑なオブジェクトの構築順序を調整する責任があります. コマンダーと抽象ビルダーの間には関連があります. そのconstruct()構築メソッドでは、ビルダーオブジェクトのコンポーネント構築およびアセンブリメソッドを呼び出して、構築を完了することができます.複雑なオブジェクト。通常、クライアントは、コンダクターと対話し、クライアント上の特定のビルダーのタイプを決定し、特定のビルダー オブジェクトをインスタンス化し (これも構成ファイルとリフレクション メカニズムを介して)、コンダクターのコンストラクターまたはセッター メソッドを渡すだけで済みます。 class このオブジェクトをコンダクター クラスに渡します。主に複雑なオブジェクトを作成するために使用され、2 つの主な機能があります: ①顧客とオブジェクトの生成プロセスを分離します; ②製品オブジェクトの生産プロセスを制御する責任があります。
4. 製品
製品の役割、特定の製品オブジェクト。
ビルダーモデルのメリットとデメリット
1.利点
- ビルダー パターンでは、クライアントは製品の内部構成の詳細を知る必要がなく、製品自体が製品作成プロセスから分離されるため、同じ作成プロセスで異なる製品オブジェクトを作成できます。
- 各特定のビルダーは比較的独立しており、他の特定のビルダーとは何の関係もないため、特定のビルダーを置き換えたり、新しい特定のビルダーを追加したりすることは簡単であり、ユーザーは異なる特定のビルダーを使用してさまざまな製品オブジェクトを取得できます。コマンダー クラスは抽象ビルダー用にプログラムされているため、新しいコンクリート ビルダーを追加しても、元のクラス ライブラリのコードを変更する必要がなく、システムの拡張が容易であり、「オープン クローズの原則」に準拠しています。
- 製品の作成プロセスをより細かく制御でき、複雑な製品の作成ステップをさまざまな方法に分解できるため、作成プロセスが明確になり、プログラムを使用して作成プロセスを制御する方が便利です。
2.短所
- ビルダーモードで作成された製品は一般的に共通点が多く、構成要素が似ていますが、異なる構成要素が多いなど製品間の差異が大きい場合、ビルダーモードの使用には適さないため、その使用範囲は以下のとおりです。制限があります。
- 製品の内部変更が複雑な場合、そのような変更を実装するために多くの特定のビルダー クラスを定義する必要が生じ、システムが非常に大きくなり、システムの理解が難しくなり、運用コストが増加する可能性があります。
4. 原則違反
たとえば、コンピューターを組み立てる場合、シャーシ、モニター、キーボード、およびマウスが必要です。
1.コンピュータインターフェース
package com.guor.builder;
public interface Computer {
// 电脑配件(主机、显示器、键盘、鼠标)
String parts();
// 品牌
String brand();
// 型号
String model();
// 价格
Double price();
// 描述
String desc();
}
2. ホスト
(1) ROGホスト
package com.guor.builder;
public class RogHost implements Computer{
@Override
public String parts() {
return "主机";
}
@Override
public String brand() {
return "ROG";
}
@Override
public String model() {
return "光刃G15";
}
@Override
public Double price() {
return 13999.00;
}
@Override
public String desc() {
return "Intel i7-12700 16G 1TB+1TSSD RTX3070 8G独显";
}
}
(2)救世主ホスト
package com.guor.builder;
public class LegionHost implements Computer {
@Override
public String parts() {
return "主机";
}
@Override
public String brand() {
return "Lenovo";
}
@Override
public String model() {
return "拯救者刃7000K";
}
@Override
public Double price() {
return 6999.00;
}
@Override
public String desc() {
return "Intel i5-12400F 16G 512G SSD RTX3060";
}
}
3. ディスプレイ
(1) ROG 32型モニター
package com.guor.builder;
public class Rog32Monitor implements Computer{
@Override
public String parts() {
return "显示器";
}
@Override
public String brand() {
return "ROG";
}
@Override
public String model() {
return "华硕PG32UG";
}
@Override
public Double price() {
return 7499.00;
}
@Override
public String desc() {
return "32寸 游戏显示器4K 144Hz HDR600";
}
}
(2) ROG 27型モニター
package com.guor.builder;
public class Rog27Monitor implements Computer {
@Override
public String parts() {
return "显示器";
}
@Override
public String brand() {
return "ROG";
}
@Override
public String model() {
return "华硕XG276Q";
}
@Override
public Double price() {
return 1899.00;
}
@Override
public String desc() {
return "27寸 电竞显示器 170Hz HDR400";
}
}
(3) サムスンディスプレイ
package com.guor.builder;
public class SamsungMonitor implements Computer {
@Override
public String parts() {
return "显示器";
}
@Override
public String brand() {
return "三星";
}
@Override
public String model() {
return "三星S27R350FHC";
}
@Override
public Double price() {
return 999.00;
}
@Override
public String desc() {
return "27寸 IPS 便携显示器 75HZ";
}
}
4. キーボード
(1) ROGメカニカルキーボード
package com.guor.builder;
public class RogKeyboard implements Computer {
@Override
public String parts() {
return "键盘";
}
@Override
public String brand() {
return "ROG";
}
@Override
public String model() {
return "龙骑士2";
}
@Override
public Double price() {
return 1899.00;
}
@Override
public String desc() {
return "机械键盘 双模 可分离式 104键 RGB背光 RX光轴";
}
}
(2) ロジクール メカニカル キーボード
package com.guor.builder;
public class LogitechKeyboard implements Computer {
@Override
public String parts() {
return "键盘";
}
@Override
public String brand() {
return "Logitech";
}
@Override
public String model() {
return "G610";
}
@Override
public Double price() {
return 479.00;
}
@Override
public String desc() {
return "cherry机械键盘 有线 104键 电竞游戏背光";
}
}
5.マウス
(1) ROGマウス
package com.guor.builder;
public class RogMouse implements Computer {
@Override
public String parts() {
return "鼠标";
}
@Override
public String brand() {
return "ROG";
}
@Override
public String model() {
return "战刃3";
}
@Override
public Double price() {
return 599.00;
}
@Override
public String desc() {
return "无限版 三模鼠标 RGB灯效可换微动26000DPI";
}
}
(2) ロジクール マウス
package com.guor.builder;
public class LogitechMouse implements Computer {
@Override
public String parts() {
return "鼠标";
}
@Override
public String brand() {
return "Logitech";
}
@Override
public String model() {
return "G402";
}
@Override
public Double price() {
return 199.00;
}
@Override
public String desc() {
return "有线鼠标 高速追踪FPS";
}
}
6. コンピューターを組み立てる
package com.guor.builder;
import java.util.ArrayList;
import java.util.List;
public class PackageComputer {
public static String getComputerList(String name, Integer grade) {
// 配件清单
List<Computer> list = new ArrayList<Computer>();
// 组装价格
Double price = 0.00;
// ROG套装
if(grade == 1){
RogHost host = new RogHost();
Rog32Monitor monitor = new Rog32Monitor();
RogKeyboard keyboard = new RogKeyboard();
RogMouse mouse = new RogMouse();
list.add(host);
list.add(monitor);
list.add(keyboard);
list.add(mouse);
price = host.price()+monitor.price()+keyboard.price()+mouse.price();
}else if(grade == 2){
// ROG机箱 + 27寸显示器 + 罗技键鼠
RogHost host = new RogHost();
Rog27Monitor monitor = new Rog27Monitor();
LogitechKeyboard keyboard = new LogitechKeyboard();
LogitechMouse mouse = new LogitechMouse();
list.add(host);
list.add(monitor);
list.add(keyboard);
list.add(mouse);
price = host.price()+monitor.price()+keyboard.price()+mouse.price();
}else if(grade == 3){
// Legion机箱 + 三星显示器 + 罗技键鼠
LegionHost host = new LegionHost();
SamsungMonitor monitor = new SamsungMonitor();
LogitechKeyboard keyboard = new LogitechKeyboard();
LogitechMouse mouse = new LogitechMouse();
list.add(host);
list.add(monitor);
list.add(keyboard);
list.add(mouse);
price = host.price()+monitor.price()+keyboard.price()+mouse.price();
}
StringBuilder builder = new StringBuilder();
builder.append(name+"组装电脑:\r\n");
builder.append("套餐:" + grade + "\r\n");
builder.append("套餐价格:" + price + " 元\r\n");
builder.append("配件清单:\r\n");
for (Computer computer : list) {
builder.append(computer.parts()+"、");
builder.append(computer.brand()+"、");
builder.append(computer.model()+"、");
builder.append(computer.price()+"、");
builder.append(computer.desc()+ "\r\n");
}
System.out.println("************************");
return builder.toString();
}
public static void main(String[] args) {
System.out.println(getComputerList("哪吒",1));
System.out.println(getComputerList("敖丙",2));
System.out.println(getComputerList("妲己",3));
}
}
7. コンソール表示
Nezha 兄弟、それは悪いお金ではありません。
このコードに問題はありません. 選択したパッケージ レベルに応じて、さまざまな構成のコンピューターを組み立てます. 頭のない ROG はクールです!
5、コードを改善するビルダーモード
1.コンピュータインターフェース
コンピューターを組み立てるには、ホスト、モニター、キーボード、およびマウスが必要です。
package com.guor.builder;
public interface IComputer {
// 主机
IComputer appendHost(Computer computer);
// 显示器
IComputer appendMonitor(Computer computer);
// 键盘
IComputer appendKeyboard(Computer computer);
// 鼠标
IComputer appendMouse(Computer computer);
// 电脑清单
String getComputerDetail();
}
2. コンピュータ実現クラスを組み立てる
package com.guor.builder;
import java.util.ArrayList;
import java.util.List;
public class BuilderComputer implements IComputer {
// 配件清单
private List<Computer> list = new ArrayList<Computer>();
// 组装价格
private Double price = 0.00;
// 姓名
private String name;
// 套餐
private int grade;
public BuilderComputer(String name, int grade) {
this.name = name;
this.grade = grade;
}
@Override
public IComputer appendHost(Computer computer) {
list.add(computer);
price += computer.price();
return this;
}
@Override
public IComputer appendMonitor(Computer computer) {
list.add(computer);
price += computer.price();
return this;
}
@Override
public IComputer appendKeyboard(Computer computer) {
list.add(computer);
price += computer.price();
return this;
}
@Override
public IComputer appendMouse(Computer computer) {
list.add(computer);
price += computer.price();
return this;
}
@Override
public String getComputerDetail() {
StringBuilder builder = new StringBuilder();
builder.append(name+"组装电脑:\r\n");
builder.append("套餐:" + grade + "\r\n");
builder.append("套餐价格:" + price + " 元\r\n");
builder.append("配件清单:\r\n");
for (Computer computer : list) {
builder.append(computer.parts()+"、");
builder.append(computer.brand()+"、");
builder.append(computer.model()+"、");
builder.append(computer.price()+"、");
builder.append(computer.desc()+ "\r\n");
}
System.out.println("************************");
return builder.toString();
}
}
3.ビルダーメソッド
package com.guor.builder;
public class Builder {
public IComputer levelOne(){
return new BuilderComputer("哪吒",1)
.appendHost(new RogHost())
.appendMonitor(new Rog32Monitor())
.appendKeyboard(new RogKeyboard())
.appendMouse(new RogMouse());
}
public IComputer levelTwo(){
return new BuilderComputer("敖丙",2)
.appendHost(new RogHost())
.appendMonitor(new Rog27Monitor())
.appendKeyboard(new LogitechKeyboard())
.appendMouse(new LogitechMouse());
}
public IComputer levelThree(){
return new BuilderComputer("妲己",3)
.appendHost(new LegionHost())
.appendMonitor(new SamsungMonitor())
.appendKeyboard(new LogitechKeyboard())
.appendMouse(new LogitechMouse());
}
public static void main(String[] args) {
Builder builder = new Builder();
System.out.println(builder.levelOne().getComputerDetail());
System.out.println(builder.levelTwo().getComputerDetail());
System.out.println(builder.levelThree().getComputerDetail());
}
}
4. コンソール表示
上記の結果と一致しています。
面倒な ifelse は取り除かれ、単一の責任とオープンとクローズの原則に準拠し、コードは読み取り可能で、再利用可能で、拡張可能です。
很多人觉得设计模式很简单,但是,能够熟练的将设计模式应用在自己的项目中,将各模块、功能规划的井井有条,运用的炉火纯青、恰到好处,真的很难。反复阅读,仔细体会。
デザイン パターン シリーズの記事:
Java デザイン パターン 7、ファクトリ メソッド パターン