概要
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的创建过程可以创建不同的表示。并返回一个复杂对象的创建。
复杂对象:是指包含多个成员变量的对象,例如汽车的很多配件、电脑的各种硬件。
建造者模式包含4个部分:
抽象建造者:它为创建一个产品对象的各个部件指定抽象接口,在该接口中,一般申明两种方法,一种是buildPartX(),另一种是getResult(),用于返回复杂对象。
具体建造者:实现了buildPartX()接口,用于创建成员变量的对象。
产品类:被创建的对象,包含多个组成部分,例如一个完整的汽车类。
指挥类:负责安排复杂对象的的建造次序,与抽象建造者之间存在关联关系,完成复杂对象的建造。
示例如下:
public class Builder {
public static void main(String[] args) {
ComputerBuilder computerBuilder = new ConcreteBuilder();
Director director = new Director(computerBuilder);
Computer computer = director.construct();
System.out.println(computer.getPartScreen());
}
}
/*******产品类*********/
class Computer
{
String partMouse;
String partKeyWord;
String partScreen;
public String getPartMouse() {
return partMouse;
}
public void setPartMouse(String partMouse) {
this.partMouse = partMouse;
}
public String getPartKeyWord() {
return partKeyWord;
}
public void setPartKeyWord(String partKeyWord) {
this.partKeyWord = partKeyWord;
}
public String getPartScreen() {
return partScreen;
}
public void setPartScreen(String partScreen) {
this.partScreen = partScreen;
}
}
/******抽象建造者*******/
abstract class ComputerBuilder
{
protected Computer computer = new Computer();
abstract void buildpartMouse();
abstract void buildpartKeyWord();
abstract void buildPartScreen();
public Computer getComputer()
{
return computer;
}
}
/**********具体建造者用来创建成员变量的对象或赋值**********/
class ConcreteBuilder extends ComputerBuilder
{
void buildpartMouse() {
computer.setPartMouse("leishen");
}
void buildpartKeyWord() {
computer.setPartKeyWord("daeryou");
}
void buildPartScreen() {
computer.setPartScreen("sanxing");
}
}
/**********指挥者类,与具体建造者类交互,返回产品复杂对象********/
class Director
{
private ComputerBuilder computerBuilder;
public Director(ComputerBuilder computerBuilder)
{
this.computerBuilder = computerBuilder;
}
public Computer construct()
{
computerBuilder.buildpartMouse();
computerBuilder.buildpartKeyWord();
computerBuilder.buildPartScreen();
return computerBuilder.getComputer();
}
}
说明:
1、上述代码块用来阐述一个电脑的装备过程,核心代码在具体建造者和指挥类内,这样设计的好处是当我们需要再进行创建一个不同配置的电脑时,我们只需要再增加一个具体建造者类,重新创建它的成员变量,而无需要更改现有代码,符合面向对象设计的开闭原则。
2、如果抽象工厂是一个汽车配件生产厂,用于生成不同类型的汽车配件,那么建造者模式则是汽车配件组装厂,用于组装并返回一个完整的汽车。这句话值得深入思考!!!