3.1 建造者模式(Builder)
例子:根据计算机组件组装不同的计算机。
用这个例子来理解一下创建者模式:首先这个模式做的事情是这样的,现在有一堆计算机零件,比如说一块硬盘它可以放在笔记本电脑上也可以放在台式机上,那么建造者模式就是把不同电脑的构建和表示分离,提供一个计算机产品类,里面包含了计算机的零件,之后提供一张“图纸”这张图纸就是一个抽象建造者接口,这个接口提供了创建的方法以及返回复杂对象的方法,具体的建造者会实现这个接口,用这张“图纸”来创造不同类型的计算机。
具体角色:
- 具体产品角色:Computer
- 抽象建造者:ComputerBuilder
- 具体建造者:DeskTopComputer、LapTopComputer
- 指挥者:ComputerWaiter
注意点:
抽象建造者里要去new一个具体产品。
protected Computer computer = new Computer();
抽象建造者里需要定义一个返回复杂产品的方法
public Computer getComputer(){
return computer;
}
具体建造者继承自抽象建造者,实现里面的所有建造方法!
public class DeskTopBuilder extends ComputerBuilder
指挥者类是真正干活的类
public class ComputerWaiter {
private ComputerBuilder cb;
public void setCb(ComputerBuilder cb){
this.cb=cb;
}
public Computer construct(){
cb.buildCPU();
cb.buildHardDisk();
cb.buildMainFrame();
cb.buildMemory();
return cb.getComputer();
}
}
这个类需要拥有一个抽象建造者的对象,利用这个对象调用其建造的方法来完整一个具体的产品并调用其方法把这个产品返回!
总结:
- 具体产品类提供了一个产品需要的零件。
- 抽象建造类相当于是总工程师画的一张图纸,这张图纸总体上实现了这个产品的建造,里面需要一个创建(new)一个具体产品的成员对象,并提供返回这个对象的方法。
- 具体建造类相当于是拿着总工程师的图纸根据实际的需要进行了二次加工,这个类继承自抽象建造类,需要实现总图纸的所有方法,不过具体的建造细节可以自己决定。
- 指挥者类是真正干活的工人,这个类拿着实际的图纸来完成工作做出具体的产品,这个类需要聚合抽象建造类,并提供setter接口方法,让外界传入具体的“图纸”参数,然后进行建造。
核心理解
建造者模式的核心在于抽象建造者类,这个类要做的事情是定义方法:首先这个类是用来建造一个实例对象的,所以一定要new一个新的产品对象作为其属性成员,然后定义建造的接口方法,根据具体需要被建造的实例的setter方法提供不同的多个建造方法接口,最后需要一个方法返回最终建造完成的对象。
这个抽象建造方法就是一张建造的图纸,后面实现这个接口的类是具体的建造图纸,把具体的建造图纸用set注入的方式给指挥者类(相当于工人)让指挥者类干活,最后根据具体图纸完成一个实例产品!