建造者模式定義:建造者模式分離了對象子組件的構造(由builder構造)和裝配(由director裝配)。從而可以構造出複雜的對象。
適用環境:某個對象構建過程比較複雜。實現對象的創建和裝配解耦,讓客戶端使用者只需要關心自己得到的產品而不是關心產品時怎樣具體產生的(這一點類似工廠模式。)
一、工廠模式與建造者模式區別及其聯繫
1.區別
工廠模式:產生的一個產品是一個整體。 比如一個強壯的機器人。一個紅的機器人
建造者模式:產生的一個產品是一堆子組件組合的複雜的對象,比如一個強壯的機器人由主體,胳膊,腿構成
2.聯繫
通常構造者模式會和工廠模式或者單例模式一起組合使用。在構造器內部提供簡單類的對象。
我是用簡單的產品機器人作爲例子練習的,兩個大部分,機器人的構建和機器人的組裝。
二、UML類圖
三、源碼
1.產品類Robot,由Body、Leg、Arm組成。
package builder;
/**
* 建造者模式:分離了對象子組件的單獨構造(由builder來負責)和裝配(由Director負責)。
* 從而可以構造出複雜的對象。這個模式適用於:某個對象的構建過程複雜的情況下使用;
* 實現創建和裝配解耦,不同的構建器,相同的裝配,也可以做出不同的對象;
* 相同的構建器,不同的裝配順序也可以做出不同的對象。也就是實現了構建算法、裝配算法的解耦,實現了更好的複用。
*/
public class Robot {
private Body body;
private Leg leg;
private Arm arm;
public Body getBody() {
return body;
}
public void setBody(Body body) {
this.body = body;
}
public Leg getLeg() {
return leg;
}
public void setLeg(Leg leg) {
this.leg = leg;
}
public Arm getArm() {
return arm;
}
public void setArm(Arm arm) {
this.arm = arm;
}
}
class Arm{
private String name;
public Arm(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Leg{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Leg(String name) {
this.name = name;
}
}
class Body{
public Body(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
2.構建者:
package builder;
public interface RobotBuilder {
Body builderBody();
Leg builderLeg();
Arm builderArm();
}
package builder;
public class StrongRobotBuilder implements RobotBuilder {
private Robot robot;
public Body builderBody() {
System.out.println("構造身體");
return new Body("強壯的身體");
}
public Leg builderLeg() {
System.out.println("構造腿");
return new Leg("強壯的腿");
}
public Arm builderArm() {
System.out.println("構造胳膊");
return new Arm("強壯的胳膊");
}
}
構建者只提供子組件構建,這裏可以使用單例模式或者工廠模式結合起來使用
3.組件者
package builder;
public interface RobotDirector {
Robot directRobot();
}
package builder;
public class StrongRobotDirector implements RobotDirector {
private RobotBuilder builder;
public StrongRobotDirector(RobotBuilder builder) {
this.builder = builder;
}
public Robot directRobot() {
Robot robot = new Robot();
robot.setBody(builder.builderBody());
robot.setArm(builder.builderArm());
robot.setLeg(builder.builderLeg());
return robot;
}
}
組裝者調用構建者得到子組件和 組裝成複雜對象robot
4.客戶端
package builder;
public class Client {
public static void main(String[] args) {
RobotBuilder builder = new StrongRobotBuilder();
RobotDirector director = new StrongRobotDirector(builder);
Robot robot = director.directRobot();
System.out.println(robot.getBody().getName());
}
}
四:總結
構建者模式用來解決構造複雜對象,比如對象包含Vo,Do,配置文件的讀取。 實現了子組件和this對象的 解耦。 builder,director都具有單一職責,對代碼的擴展放開。當需要新增一個同族類似產品時只需要新建Builder類和對應的產品類。