前段时间一直忙于考证,没有整理,打开博客感觉又好像过了很久的样子,哎,松懈时间过得真快,今天整理一波建造者模式。
从字面意思建造者模式更倾向于建造。例如计算机包含鼠标,键盘,耳机,音响,打印机等等硬件设备。这是一个相对比较复杂的对象。而我们要创建的是计算机这个整体,如果采用工厂模式就没那么专业。因为工厂模式更多的是提供单个组件的创建。所以这里用建造者模式会比较好一点。
准备一个计算机实体类
/**
* 计算机对象
*/
public class Computer {
//鼠标对象,模拟
private String mouse;
//键盘对象,模拟
private String keyBoard;
//耳机对象,模拟
private String earphone;
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 String getEarphone() {
return earphone;
}
public void setEarphone(String earphone) {
this.earphone = earphone;
}
}
准备一个创建组件的抽象类
/**
* 创建builder抽象类,封装了各种创建组件的方法
*/
public abstract class ComputerBuilder {
//维护一个计算机对象,用于返回
protected Computer computer = new Computer();
public abstract void buildMouse();
public abstract void buildKeyBoard();
public abstract void buildEarphone();
public Computer getResult(){
return computer;
}
}
准备一个具体计算机的创建组件实现类
/**
* 具体某个品牌电脑的创建实现类,进行自己的组件创建
*/
public class AppleComputerBuilder extends ComputerBuilder {
@Override
public void buildMouse() {
computer.setMouse("mouse");
}
@Override
public void buildKeyBoard() {
computer.setKeyBoard("keyBoard");
}
@Override
public void buildEarphone() {
computer.setEarphone("earphone");
}
}
准备一个建造类,用于返回创建对象
/**
* 建造指挥者
*/
public class Director {
private ComputerBuilder computerBuilder;
//采用多态的形式维护一个builder对象
public Director(ComputerBuilder computerBuilder){
this.computerBuilder=computerBuilder;
}
/**
* 提供一个建造的方法,将内部的组件统一进行创建
* @return
*/
public Computer constructComputer(){
computerBuilder.buildEarphone();
computerBuilder.buildKeyBoard();
computerBuilder.buildMouse();
return computerBuilder.getResult();
}
//测试
public static void main(String[] args) {
Computer computer = new Director(new AppleComputerBuilder()).constructComputer();
System.out.println(computer.getEarphone()+"..."+computer.getKeyBoard()+"..."+computer.getMouse());
}
}
到此一个复杂的对象就创建出来了
主要优点
1.横向扩展性好,不同的计算机厂商可以有不同的实现
2.客户端不需要知道里面实现的细节
主要缺点:
产品创建相对比较僵硬,只能是这些组件,如果后续需要增加组件,那么维护起来麻烦。