Javaのデザインパターン - ジェネレータ・モード

同一の構築プロセスが異なる表現を作成することができるように、それは、構築物および複合オブジェクトのその分離を表します。

Builderパターン

同一の構築プロセスが異なる表現を作成できるように、その表現から複雑なオブジェクトの構造を分離します。

クラス図

の構造と使用

構造・ジェネレータ・モードでは、4つの役割を有しています。

  • プロダクト(製品):複雑なオブジェクトの特定の発電機を構築します。
  • 抽象ジェネレータ(要約ビルダ):製品のオブジェクトの個々のコンポーネントの作成に加えて、多数の方法を定義する抽象ジェネレータインターフェースだけでなく、メソッドを定義するには、製品のオブジェクトを返します。
  • 詳細な発電機(コンクリートビルダ):ビルダーインタフェースの実装クラスは、特にビルダービルダーインタフェースの実装は、定義されました。
  • ディレクター(監督):司令官は、インターフェイスビルダー内で宣言される変数を含むクラスです。指揮官の責任は、要求された特定の発電機が正常にProductオブジェクトを構築した場合、コマンドは、ユーザーが必要とする製品のオブジェクトを構築するために、特定のビルダーを要求するユーザーに特定の発電機を提供する責任があり、司令官は作ることができます製品の具体的な戻り生成されたオブジェクトを構築します。

簡単な例

製品抽象クラスPanelProduct.java

      
      
1
2
3
4
5
6
7
8
9
      
      
パッケージ ビルダー;
インポート するjavax.swing。*;
パブリック クラスが 延びている のJPanelを {
JButtonのボタン。
JLabelのラベル。
JTextFieldのテキストフィールド;
}

ビルダービルダー抽象インタフェース・クラスBuilder.java

      
      
1
2
3
4
5
6
7
8
9
10
      
      
パッケージ ビルダー;
輸入 javax.swing.JPanel。
パブリック インターフェイス ビルダー {
公共の 抽象 無効 buildButton () ;
公共の 抽象 無効 buildLabel () ;
公共の 抽象 無効 buildTextField () ;
パブリック 抽象 JPanelのgetPanel () ;
}

ConcreteBuilder実装クラスConcreteBuilderOne.java

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
      
      
package Builder;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ConcreteBuilderOne implements Builder {
private PanelProduct panel;
public ConcreteBuilderOne() {
panel = new PanelProduct();
}
public void buildButton() {
panel.button = new JButton( "按钮");
}
public void buildLabel() {
panel.label = new JLabel( "标签");
}
public void buildTextField() {
panel.textField = new JTextField( "文本框");
}
public JPanel getPanel() {
panel.add(panel.button);
panel.add(panel.label);
panel.add(panel.textField);
return panel;
}
}

ConcreteBuilder的实现类ConcreteBuilderTwo.java

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
      
      
package Builder;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class ConcreteBuilderTwo implements Builder {
private PanelProduct panel;
public ConcreteBuilderTwo() {
panel = new PanelProduct();
}
public void buildButton() {
panel.button = new JButton( "button");
}
@Override
public void buildLabel() {
panel.label = new JLabel( "label");
}
@Override
public void buildTextField() {
panel.textField = new JTextField( "My文本框");
}
@Override
public JPanel getPanel() {
panel.add(panel.textField);
panel.add(panel.label);
panel.add(panel.button);
return panel;
}
}

指挥类Director.java

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      
      
package Builder;
import javax.swing.JPanel;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public JPanel constructProduct() {
builder.buildButton();
builder.buildLabel();
builder.buildTextField();
JPanel product = builder.getPanel();
return product;
}
}

测试类Application.java

      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
      
      
ppackage Builder;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Application {
public static void main(String[] args) {
Builder builder = new ConcreteBuilderOne();
Director director = new Director(builder);
JPanel panel = director.constructProduct();
JFrame frameOne = new JFrame();
frameOne.add(panel);
frameOne.setBounds( 12, 12, 200, 120);
frameOne.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frameOne.setVisible( true);
builder = new ConcreteBuilderTwo();
director = new Director(builder);
panel = director.constructProduct();
JFrame frameTwo = new JFrame();
frameTwo.add(panel);
frameTwo.setBounds( 212, 12, 200, 120);
frameTwo.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frameTwo.setVisible( true);
}
}

运行截图

生成器模式的优点

  • 生成器模式将对象的构造过程封装在具体生成器中,用户使用不同的具体生成器就可以得到该对象的不同表示。
  • 生成器模式将对象的构造过程从创建对象的类中分离出来,使用户无需了解该对象的具体组件。
  • これは、より効率的に細かくプロセス制御オブジェクトを構成することができます。ジェネレータは、プログラムをより正確にすることができ、いくつかのステップ、オブジェクト全体構造の効果的な制御に分割されているオブジェクトを処理するように構成されています。
  • パターン発生器は切り離さオブジェクトクラスで作成されたオブジェクトを処理するように構成されたので、より柔軟な弾性のオブジェクトを作成します。
  • 閉鎖原則 - 新しいコンクリートプロデューサを追加する場合、コマンダのコードを変更することなく、すなわち、パターンは、開口部を満たします。

該当する発電機モードのシナリオ

  • システムは、物体の複雑な内部構造をユーザーに提供する準備ができて、オブジェクトが構築時に作成するコードを記述することで、ユーザーのニーズを満たすことができない場合、パターン発生器、このようなオブジェクトを使用して構築することができます。
  • いくつかのシステム構成プロセスを必要とする場合、オブジェクトクラスを作成するには、オブジェクトの独立していなければなりません。

ソースが行くダウンロード

MyGitHub

オリジナル:ビッグボックス  のJavaデザインパターン-ジェネレータ・モード


おすすめ

転載: www.cnblogs.com/petewell/p/11607157.html