设计模式之建造模式

如有转载,请申明:

转载至 http://blog.csdn.net/qq_35064774/article/details/52089568


1 什么是建造模式

 

建造模式是对象的创建模式。建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

 

2 如何实现建造模式

 

先从一个小问题入手。

 

 * 假设电脑由主板、CPU、内存、硬盘和显卡组成

 * 为了组装一台电脑,我们需要先装主板,然后装CPU、内存、硬盘、显卡

 * 请你设计几个类来描述这一创造过程

 

很明显我们需要设计好多类来组成一台电脑,且这些类有明显的先后建造次序,因此用建造模式就比较合适。

 

建造模式的思想是客户无需知道产品内部是如何建造的,只需要通过一个导演类的方法就可以轻松的建造出来。所以这次我们先写测试类。

 

package com.ittianyu.builder;

public class Test {
	public static void main(String[] args) {
		ComputerDirector director = new ComputerDirector();
		Computer computer = director.construct();
		
		System.out.println(computer);
	}
}


 

测试代码非常简单,new一个ComputerDirector对象,通过这个对象创建了一个Computer对象,我们完全不用知道电脑里面是怎么组装的。

接下来我们需要来写ComputerDirector类,这个类有个方法construct返回Computer对象。


package com.ittianyu.builder;

public class ComputerDirector {
	protected Builder builder = new ComputerBuilder();
	
	public Computer construct() {
		builder.builderPart1();
		builder.builderPart2();
		builder.builderPart3();
		builder.builderPart4();
		builder.builderPart5();
		
		return (Computer)builder.retrieveResult();
	}
}


你可能会问BuilderComputerBuilder是什么东西。别急,我们先把方法内的代码看完。

方法主要调用了5builder对象的方法,这些方法名字还特别像,一看就知道是建造5个部分,最后调用builder.retrieveResult()来返回生成的对象。

你是不是以为这个导演类是最复杂的,所有构建逻辑都在里面。事实上这个导演类只是负责进一步封装Builder的子类。实际构建逻辑在具体的Builder的子类。

不墨迹了,我们来看一下Builder类和子类。


package com.ittianyu.builder;

public abstract class Builder {
	public abstract void builderPart1();
	public abstract void builderPart2();
	public abstract void builderPart3();
	public abstract void builderPart4();
	public abstract void builderPart5();
	public abstract Object retrieveResult();
}

 

Builder类很简单,只是定义了抽象方法。定义这个抽象类只是为了代码复用,如果后面又多出一个Phone的建造类,这时还可以继承这个类来统一接口。

接下来我们看看具体的ComputerBuilder类。

 

package com.ittianyu.builder;

public class ComputerBuilder extends Builder {
	protected Computer computer = new Computer();
	
	@Override
	public void builderPart1() {
		computer.setMainBoard("华硕主板001");
	}

	@Override
	public void builderPart2() {
		computer.setCPU("I7 6820HK");
	}

	@Override
	public void builderPart3() {
		computer.setRAM("金士顿 DDR4");
	}

	@Override
	public void builderPart4() {
		computer.setHD("JR 100X6P 3PTM");
	}

	@Override
	public void builderPart5() {
		computer.setGPU("NVIDIA GeForce GTX 960M");
	}
	
	@Override
	public Object retrieveResult() {
		return computer;
	}
}

 

是不是吃了一惊,怎么内部只有个Computer类。

这主要是我太懒了不想建那么多类,比如什么CPU、主板、GUP这些类,所以全部用String代替了,建造的时候直接就设置了一下字符串。(0.0原谅我这一生不羁放荡爱自由)

到这里算是完成了。

慢着,好像忘了最重要的产品类,也就是Computer类。

天了噜,等我把这类补上。

 

package com.ittianyu.builder;

public class Computer {
	private String mainBoard;
	private String CPU;
	private String RAM;
	private String HD;
	private String GPU;
	
	public Computer(){}
	public Computer(String mainBoard, String cPU, String rAM, String hD,
			String gPU) {
		super();
		this.mainBoard = mainBoard;
		CPU = cPU;
		RAM = rAM;
		HD = hD;
		GPU = gPU;
	}
	public String getMainBoard() {
		return mainBoard;
	}
	public void setMainBoard(String mainBoard) {
		this.mainBoard = mainBoard;
	}
	public String getCPU() {
		return CPU;
	}
	public void setCPU(String cPU) {
		CPU = cPU;
	}
	public String getRAM() {
		return RAM;
	}
	public void setRAM(String rAM) {
		RAM = rAM;
	}
	public String getHD() {
		return HD;
	}
	public void setHD(String hD) {
		HD = hD;
	}
	public String getGPU() {
		return GPU;
	}
	public void setGPU(String gPU) {
		GPU = gPU;
	}
	@Override
	public String toString() {
		return "Computer [mainBoard=" + mainBoard + ", CPU=" + CPU + ", RAM="
				+ RAM + ", HD=" + HD + ", GPU=" + GPU + "]";
	}
}


这个类看着长了点,其实也就是5个成员变量,然后是这些变量的getsettoString方法。

 

 

 

3 什么时候需要建造模式

 

看过上面的实现后相信你对建造模式有了一定的了解。

最后我们来总结一下使用建造模式的情况。

 

 * 需要生成的产品对象有复杂的内部结构。

 * 需要生成的产品对象的属性相互依赖。也就是内部属性构造有顺序要求。

 * 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值