设计模式(三)之生成器模式(Builder Pattern)
2014-02-07 16:31
696 查看
生成器模式
1、描述
将一个复杂对象的构建与它的表现分离,使同样的构建过程可以创建不同的表现。
2、使用场景
当系统准备为用户提供一个内部结构复杂的对象,而且在构造方法中编写创建该对象的代码无法满足用户需求时,就可以使用生成器模式来构造这样的对象。
当某些系统要求对象的构造过程必须独立于创建该对象的类时。
eg:我们要写一个包含有按钮、标签和文本框的组件容器。不同用户对容器有着不同的要求。比如有些用户希望容器中只含有按钮和标签,有些用户希望容器中含有的标签、按钮和文本框。另外,用户对组件在容器中的顺序位置也有不同的要求,比如某些用户要求组件在容器中排列是按钮、标签、文本框,有的用户希望排列顺序是标签、文本框、按钮。显然我们不能在容器的构造方法中编写组件的创建代码,也不能编写排列这些组件位置的代码。
3、模式中的角色
产品(Product):具体生成器要构造的复杂对象。
抽象生成器(Builder):抽象生成器是一个接口,该接口除了创建一个Product对象的各个组件定义了若干个方法外,还要定义返回Product对象的方法。
具体生成器(ConcreteBuilder):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法。
指挥者(Director):指挥者是一个类,该类需含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体的生成器,即指挥者将请求具体生成器来构造用户所需要的Product对象,如果所请求的具体生成器成功的构造出Product对象,指挥者就可以让该具体生成器返回所构造的Product对象。(可以不需要)
4、类的关系图
5、代码实现
运行结果:
1、描述
将一个复杂对象的构建与它的表现分离,使同样的构建过程可以创建不同的表现。
2、使用场景
当系统准备为用户提供一个内部结构复杂的对象,而且在构造方法中编写创建该对象的代码无法满足用户需求时,就可以使用生成器模式来构造这样的对象。
当某些系统要求对象的构造过程必须独立于创建该对象的类时。
eg:我们要写一个包含有按钮、标签和文本框的组件容器。不同用户对容器有着不同的要求。比如有些用户希望容器中只含有按钮和标签,有些用户希望容器中含有的标签、按钮和文本框。另外,用户对组件在容器中的顺序位置也有不同的要求,比如某些用户要求组件在容器中排列是按钮、标签、文本框,有的用户希望排列顺序是标签、文本框、按钮。显然我们不能在容器的构造方法中编写组件的创建代码,也不能编写排列这些组件位置的代码。
3、模式中的角色
产品(Product):具体生成器要构造的复杂对象。
抽象生成器(Builder):抽象生成器是一个接口,该接口除了创建一个Product对象的各个组件定义了若干个方法外,还要定义返回Product对象的方法。
具体生成器(ConcreteBuilder):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法。
指挥者(Director):指挥者是一个类,该类需含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体的生成器,即指挥者将请求具体生成器来构造用户所需要的Product对象,如果所请求的具体生成器成功的构造出Product对象,指挥者就可以让该具体生成器返回所构造的Product对象。(可以不需要)
4、类的关系图
5、代码实现
package org.sunday.builder; /** * 产品 * @author sunday * */ public class PanelProduct { private Label lable; private TextField textField; private Button button; public Label getLable() { return lable; } public void setLable(Label lable) { this.lable = lable; } public TextField getTextField() { return textField; } public void setTextField(TextField textField) { this.textField = textField; } public Button getButton() { return button; } public void setButton(Button button) { this.button = button; } @Override public String toString() { return lable.getColor()+"标签 "+textField.getColor()+"输入框 " + button.getColor() + "按钮"; } }
package org.sunday.builder; /** * 抽象生成器 * @author sunday * */ public interface Builder { public abstract void builderLabel(); public abstract void builderTextField(); public abstract void builderButton(); public abstract PanelProduct getPanel(); }
package org.sunday.builder; /** * 具体生成器 * @author sunday * */ public class BuilderOne implements Builder { private PanelProduct pp; public BuilderOne(PanelProduct pp) { this.pp = pp; } @Override public void builderLabel() { pp.setLable(new Label("黑色")); } @Override public void builderTextField() { pp.setTextField(new TextField("黑色")); } @Override public void builderButton() { pp.setButton(new Button("黑色")); } @Override public PanelProduct getPanel() { builderLabel(); builderButton(); builderTextField(); return pp; } }
package org.sunday.builder; /** * 具体生成器 * @author sunday * */ public class BuilderTwo implements Builder { private PanelProduct pp; public BuilderTwo(PanelProduct pp) { this.pp = pp; } @Override public void builderLabel() { pp.setLable(new Label("黄色")); } @Override public void builderTextField() { pp.setTextField(new TextField("蓝色")); } @Override public void builderButton() { pp.setButton(new Button("白色")); } @Override public PanelProduct getPanel() { builderLabel(); builderButton(); builderTextField(); return pp; } }
package org.sunday.builder; public class Test { public static void main(String[] args) { Builder one = new BuilderOne(new PanelProduct()); System.out.println(one.getPanel().toString()); Builder two = new BuilderTwo(new PanelProduct()); System.out.println(two.getPanel().toString()); } }
运行结果:
相关文章推荐
- java设计模式---生成器模式(Builder pattern)
- C#设计模式——生成器模式(Builder Pattern)
- 设计模式 生成器模式(builder Pattern)
- 设计模式学习——建造者模式(Builder Pattern)/生成器模式
- (六)二十三中设计模式之我见------------建造者模式或生成器模式(Builder Pattern)
- C#设计模式——生成器模式(Builder Pattern)
- 设计模式——生成器模式(Builder Pattern)
- C#设计模式——生成器模式(Builder Pattern)
- 设计模式学习笔记(五):建造者模式【Builder Pattern】(三)问题引申
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
- 设计模式----建造者模式(Builder Pattern)
- NET设计模式4--建造者模式(Builder Pattern)
- 设计模式-建造者模式(Builder Pattern)
- 我所理解的设计模式(C++实现)——建造者模式(Builder Pattern)
- 设计模式——建造者模式(BuilderPattern)
- JAVA设计模式之 建造者模式【Builder Pattern】
- design pattern Builder 建造者设计模式
- [设计模式]第四回:建造者模式(Builder Pattern)
- C#设计模式(5)——建造者模式(Builder Pattern)
- 设计模式笔记——(二:建造者模式 Builder Pattern)