设计模式(三)之生成器模式(Builder Pattern)

生成器模式

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());
	}
}

运行结果:

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值