建造者模式-Builder Pattern

基本概念

建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,又叫做生成器模式。建造者模式将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同内部表象的产品对象。

结构图


上图摘自《大话设计模式》

应用场景

如果一个对象的创建有固定的组成和流程,如组装电脑,包括主机、显示器、键盘、鼠标等几个主要部分(示例代码就是以此为例的),当需要将复杂对象的创建与它的表示分离时可以使用建造者模式。使用了建造着模式,只需要传入指定的建造类型就可以得到对应的产品,而具体的建造过程和细节则不需要知道。

源码示例(以组装电脑为例)

1.创建产品类,即Computer

package com.spook.builder;

/**
 * 产品类,以计算机为例,建造者模式最终就是要创建出产品
 */
public class Computer {

	/** 主机 */
	private String host;
	/** 显示器 */
	private String monitor;
	/** 鼠标 */
	private String mouse;
	/** 键盘 */
	private String keyboard;

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public String getMonitor() {
		return monitor;
	}

	public void setMonitor(String monitor) {
		this.monitor = monitor;
	}

	public String getMouse() {
		return mouse;
	}

	public void setMouse(String mouse) {
		this.mouse = mouse;
	}

	public String getKeyboard() {
		return keyboard;
	}

	public void setKeyboard(String keyboard) {
		this.keyboard = keyboard;
	}
	
	public void show() {
		System.out.println("主机:" + getHost() + ",显示器:" + getMonitor() + ",鼠标:" + getMouse() + ",键盘:" + getKeyboard());
	}

}
2.创建builder接口

package com.spook.builder;

/**
 * 电脑建造者接口,假定电脑由以下四部分组成
 */
public interface ComputerBuilder {
	/** 添加主机 */
	public void addHost();

	/** 添加显示器 */
	public void addMonitor();

	/** 添加鼠标 */
	public void addMouse();

	/** 添加键盘 */
	public void addKeyBoard();

	/** 组装,返回一个电脑对象 */
	public Computer build();

}
3.创建builder接口的一个实现类,LenovoBuilder

package com.spook.builder;

public class LenovoBuilder implements ComputerBuilder {

	private Computer lenoveComputer = new Computer();
	
	@Override
	public void addHost() {
		// TODO Auto-generated method stub
		lenoveComputer.setHost("联想主机");
	}

	@Override
	public void addMonitor() {
		// TODO Auto-generated method stub
		lenoveComputer.setMonitor("联想显示器");
	}

	@Override
	public void addMouse() {
		// TODO Auto-generated method stub
		lenoveComputer.setMouse("联想鼠标");
	}

	@Override
	public void addKeyBoard() {
		// TODO Auto-generated method stub
		lenoveComputer.setKeyboard("联想键盘");
	}

	@Override
	public Computer build() {
		// TODO Auto-generated method stub
		return lenoveComputer;
	}

}
4.创建builder接口的另一个实现类,DellBuilder

package com.spook.builder;

public class DellBuilder implements ComputerBuilder {
	
	private Computer dellComputer = new Computer();

	@Override
	public void addHost() {
		// TODO Auto-generated method stub
		dellComputer.setHost("戴尔主机");
	}

	@Override
	public void addMonitor() {
		// TODO Auto-generated method stub
		dellComputer.setMonitor("戴尔显示器");
	}

	@Override
	public void addMouse() {
		// TODO Auto-generated method stub
		dellComputer.setMouse("戴尔鼠标");
	}

	@Override
	public void addKeyBoard() {
		// TODO Auto-generated method stub
		dellComputer.setKeyboard("戴尔键盘");
	}

	@Override
	public Computer build() {
		// TODO Auto-generated method stub
		return dellComputer;
	}

}
5.创建一个工人类,通过不同的Builder生产不同的电脑

package com.spook.builder;

/**
 * 组装电脑的工人,可选用不同的建造者建造不同型号的电脑
 */
public class Worker {

	/***
	 * 通过特定的建造者来组装电脑
	 * 
	 * @param builder
	 */
	public void assembleByBuilder(ComputerBuilder builder) {
		builder.addHost();
		builder.addMonitor();
		builder.addMouse();
		builder.addKeyBoard();
	}

}
6.测试类

package com.spook.builder;

/***
 * 测试类
 */
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Worker worker = new Worker();
		/**
		 * 联想电脑建造者
		 */
		ComputerBuilder lenovoBuilder = new LenovoBuilder();
		worker.assembleByBuilder(lenovoBuilder);
		Computer lenovoComputer = lenovoBuilder.build();
		lenovoComputer.show();
		
		/**
		 * 戴尔电脑建造者
		 */
		ComputerBuilder dellBuilder = new DellBuilder();
		worker.assembleByBuilder(dellBuilder);
		Computer dellComputer = dellBuilder.build();
		dellComputer.show();
	}

}
运行测试类会输出如下内容:

主机:联想主机,显示器:联想显示器,鼠标:联想鼠标,键盘:联想键盘
主机:戴尔主机,显示器:戴尔显示器,鼠标:戴尔鼠标,键盘:戴尔键盘








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值