Java学习笔记之--------建造者模式

使用场景

我们需要构建一个复杂的产品。比如:电脑,手机,飞船。这个复杂产品的创建,有这样一个问题需要处理:装配子组件是不是需要特定的步骤?

实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时,我们就可能需要想到建造者模式。

建造者模式的本质

建造者模式又称生成器模式,建造者模式分离了对象子组件的单独构造(由builder来负责)和装配(由director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构造过程比较复杂的时候。

由于实现了构建和装配的解耦,不同的构造器,相同的装配可以做出不同的对象;相同的构造器,不同的装配也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。

创建者模式的优点:将一个复对象的创建过程封装起来。允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同)。向客户隐藏产品内部的实现。产品的实现可以被替换,因为客户只看到一个抽象的接口。

建造者模式demo

我们需要一台台式机,这台台式机由显示器、主机、鼠标、键盘组成。具体代码如下:

public class Computer {
	//显示器
	private Monitor monitor;
	//主机
	private Host host;
	//键盘
	private Keyboard keyboard;
	//鼠标
	private Mouse mouse;

	public void open(){
		System.out.println("打开电脑!");
	}
	public Monitor getMonitor() {
		return monitor;
	}
	public void setMonitor(Monitor monitor) {
		this.monitor = monitor;
	}
	public Host getHost() {
		return host;
	}
	public void setHost(Host host) {
		this.host = host;
	}
	public Keyboard getKeyboard() {
		return keyboard;
	}
	public void setKeyboard(Keyboard keyboard) {
		this.keyboard = keyboard;
	}
	public Mouse getMouse() {
		return mouse;
	}
	public void setMouse(Mouse mouse) {
		this.mouse = mouse;
	}
}
public class Monitor {
	private String name;
	public Monitor(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
} 
public class Host {
	private String name;
	public Host(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
} 
public class Keyboard {
	private String name;
	public Keyboard(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
public class Mouse {
	private String name;
	public Mouse(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
} 
public interface ComputerBuilder {
	Monitor buildMonitor();
	Keyboard buildKeyboard();
	Host buildHost();
	Mouse buildMouse();
}
public class TestComputerBuilder implements ComputerBuilder {
	@Override
	public Monitor buildMonitor() {
		System.out.println("构建显示器");
		return new Monitor("显示器");
	}
	@Override
	public Host buildHost() {
		System.out.println("构建主机");
		return new Host("主机");
	}
	@Override
	public Keyboard buildKeyboard() {
		System.out.println("构建键盘");
		return new Keyboard("键盘");
	}
	@Override
	public Mouse buildMouse() {
		System.out.println("构建鼠标");
		return new Mouse("鼠标");
	}
}
public interface ComputerDirector {
	/**
	 * 组装电脑
	 * @return
	 */
	Computer dircetComputer();
}
public class TestComputerDirector implements ComputerDirector {
	private ComputerBuilder computerBuilder;
	public TestComputerDirector(ComputerBuilder computerBuilder) {
		this.computerBuilder = computerBuilder;
	}
	@Override
	public Computer dircetComputer() {
		Monitor monitor = computerBuilder.buildMonitor();
		Keyboard keyboard = computerBuilder.buildKeyboard();
		Host host = computerBuilder.buildHost();
		Mouse mouse = computerBuilder.buildMouse();
		//装配成台式机
		Computer computer = new Computer();
		computer.setHost(host);
		computer.setKeyboard(keyboard);
		computer.setMonitor(monitor);
		computer.setMouse(mouse);
		return computer;
	}
}
public class Client {
	public static void main(String[] args) {
		ComputerDirector director = new TestComputerDirector(new TestComputerBuilder());
		Computer c = director.dircetComputer();
		System.out.println(c.getKeyboard());
		c.open();
	}
} 

运行结果如下:

类图

这里将Keyboard、Host、Monitor、Mouse四个类省略了,不然生成的类图十分庞大。

开发中的应用场景

StringBuilder类的append方法

SQL中的preparedSataement

JDOM中的DomBuilder,SAXBuilder

(以Builder结尾的类大多都应用了构建者模式)

 

以上为建造者模式的学习笔记,此文章为尚学堂视频的学习笔记+自己总结。参考资料:Head First 设计模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值