见名之意,建造者就是用来建造对象的嘛!不过...等等,我们先前不是有工厂模式吗?我记得工厂模式也是用来创建对象的阿? 别着急,听我说!
我们得将这两种模式区分一下,工厂模式是用来创建一个对象,它只初始化对象必须具备的属性,而建造者模式呢,是在创建完对象的基础上,再对对象进行一系列操作从而拿到更加完善的对象! 就比如造房子,工厂模式就像是提供一个地基,而通过建造者模式,我们可以在有地基的基础上,再进行砌砖,打梁,盖瓦...等等操作最终得到一个房子!
现在我们试想一下,如果需要你来组装一台电脑,你需要先插好主板,再装上CPU,然后是显卡,电源,内存...等等,然而,你可能犯迷糊了,忘记装上内存...那你的电脑可就无法正常运行了!当不同的人去组装电脑时,都有可能忘记做某事而导致电脑无法正常开机, 这在我们程序里面表示的就是,构建某一个对象,然而忘记了某个步骤,导致最终形成的对象与期待不相匹配! 就比如构建一个游戏人物,然而忘记绘制双手...这就很尴尬了!
所以,我们需要某种方式,通过这种方式可以标准化的构建某个对象,那么这种构建对象的方式,就称为建造者模式!
OK,这个模式很简答, 就不多说了,直接让代码撸起来!
//抽象电脑类,这些步骤也是有顺序的,不能让客户端瞎搞
//总不能主板好没装就插内存条吧?往哪插?
abstract class AbstractComputer{
abstract void addMainBoard();//安装主板
abstract void addCPU();//安装CPU
abstract void addGraphics();//安装显卡
abstract void addPower();//安装电源
abstract void addMemory();//安装内存条
abstract void joints();//将各部件的插线连接好
}
//一台联想电脑
class ThinkComputer extends AbstractComputer{
@Override
void addMainBoard() {
System.out.println("安装好联想牌主板");
}
@Override
void addCPU() {
System.out.println("安装好联想牌CPU");
}
@Override
void addGraphics() {
System.out.println("安装好联想牌显卡");
}
@Override
void addPower() {
System.out.println("安装好联想牌电源");
}
@Override
void addMemory() {
System.out.println("安装好联想牌内存");
}
@Override
void joints() {
System.out.println("将联想牌电脑插线全部插好");
}
}
//一台华硕电脑
class AsusComputer extends AbstractComputer{
@Override
void addMainBoard() {
System.out.println("安装好华硕牌主板");
}
@Override
void addCPU() {
System.out.println("安装好华硕牌CPU");
}
@Override
void addGraphics() {
System.out.println("安装好华硕牌显卡");
}
@Override
void addPower() {
System.out.println("安装好华硕牌电源");
}
@Override
void addMemory() {
System.out.println("安装好华硕牌内存");
}
@Override
void joints() {
System.out.println("将华硕牌电脑插线全部插好");
}
}
//构建者对象,可以标准化,流程化构建电脑对象,客户端不需要知道一台电脑具体该怎么组装,
//只要告知构建者要组装的电脑,它就能正确的对其进行组装!
class ComputerBuilder{
public AbstractComputer buildComputer(AbstractComputer ac){
ac.addMainBoard();
ac.addCPU();
ac.addGraphics();
ac.addPower();
ac.addMemory();
ac.joints();
return ac;
}
}
public class Test {
public static void main(String[] args) {
AbstractComputer acThink = new ThinkComputer();
AbstractComputer acAsuc = new AsusComputer();
ComputerBuilder cb = new ComputerBuilder();
//让构建者构建好联想电脑;
acThink = cb.buildComputer(acThink);
System.out.println("********************************");
acAsuc = cb.buildComputer(acAsuc);
}
}
安装好联想牌主板
安装好联想牌CPU
安装好联想牌显卡
安装好联想牌电源
安装好联想牌内存
将联想牌电脑插线全部插好
********************************
安装好华硕牌主板
安装好华硕牌CPU
安装好华硕牌显卡
安装好华硕牌电源
安装好华硕牌内存
将华硕牌电脑插线全部插好
**********************************************************
是不是很简单啦!