Builder 模式的定义如下:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
看懂吗?搞不懂那些写定义的人为什么不写通俗点。通俗地说就是:将一个复杂对象的创建和部件的创建分开,如造艘船,构建船的对象和构建船的部件是分开的,是不是还是有点不懂,没事再听。打个比方作为客户,造船的时候,每个部件的建造过程,作为客户是看不到的,而客户看到的介绍是:船有船身,甲板,桅杆(船还没造呢)。所以客户看不到的就是部件的构建过程,客户看到的就是对象的构建过程。
那有什么用:
还是上面那个例子,客户想到了船的组成,而船可以造几种,也就是有不同的表示,有一天客户看到了这个船不满意了,说我想用木头,你们怎么用铁,所以,老板还是按照设计图纸在搞一遍。这个过程的价值就体现出来了。是的,不用再设计船了。
package designPatterns;
class Ship{
private String body;
private String board;
private String mast;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getBoard() {
return board;
}
public void setBoard(String board) {
this.board = board;
}
public String getMast() {
return mast;
}
public void setMast(String mast) {
this.mast = mast;
}
}
interface ShipBuilder{//构建部件的构成在这里独立出来
public void buildBody();
public void buildBorad();
public void buildMast();
public Ship buildShip();
}
class IronShipBuilder implements ShipBuilder{
Ship ship=new Ship();
public void buildBody() {
// TODO Auto-generated method stub
ship.setBody("船身正在造");
System.out.println("船身造好了!");
}
public void buildBorad() {
ship.setBoard("甲板正在造");
System.out.println("甲板造好了");
}
public void buildMast() {
// TODO Auto-generated method stub
ship.setMast("桅杆正在造");
System.out.println("桅杆造好了");
}
public Ship buildShip() {
// TODO Auto-generated method stub
System.out.println("铁船造好了");
return ship;//把造完的船这个对象送出去。
}
}
class ShipDirector{//这就是客户看到的设计蓝图
public static Ship bulidShip(ShipBuilder sb){
sb.buildBody();
sb.buildBorad();
sb.buildMast();
return sb.buildShip();
}
}
public class MyBuilder {
public static void main(String[] args) {
//这是我需要一艘船,
//一艘铁船
Ship ship = ShipDirector.bulidShip(new IronShipBuilder());
//船就建好了,
}
}