building--構建者模式
阿新 • • 發佈:2019-01-29
又到一個新的模式了,堅持三兩天一個模式吧。好了, 不多扯這沒用的了,正式來學習我們的構建者模式。
1、使用場景:
我覺得是在其它類中不關心構建過程,在初始化之前或在初始化時需要大量設定、呼叫屬性或方法時使用。
來自百度文庫:
缺點:
建造者模式的“加工工藝”是暴露的,這樣使得建造者模式更加靈活,也使得工藝變得對客戶不透明。
優點:
建造模式的使用使得產品的內部表象可以獨立地變化。使用建造模式可以使客戶端不必知道產品內部組成的細節。
每一個Builder都相對獨立,而與其他的Builder無關。 模式所建造的最終產品更易於控制。
理解:
以一個造車與造船為本次的模式做理解,客戶需要一輛車,和一隻船做為交通工具。此時,客戶是不需要知道車與船是如何製造出來的,客戶只是關心需要得到車和船。
一輛能執行的車或船隻應該有發動機和燃料(如果讀者要鑽牛角尖,那我也無能為力啦),製造發動機是需要材料與工人的,對車來說,它只是需要發動機與燃料。所以在我們的構建者中需要為車準備材料與工人。管理員,對構建車或船做管理。
UML圖:
對應程式碼:
首先我們需要一個構建交通工具的抽象類(也可以是介面)
public abstract class AbstractTrafficToolsBuilding { protected ITrafficTools trafficTools; public abstract void buildingMaterial(); public abstract void buildingWorker(); public abstract ITrafficTools resultTrafficTools(); }
兩個具體實現類:
public class CarBuilding extends AbstractTrafficToolsBuilding { public CarBuilding(){ this.trafficTools = new Car(); } @Override public void buildingMaterial() { System.out.println("找到安裝車的材料...."); } @Override public void buildingWorker() { System.out.println("找到安裝車的工人..."); } @Override public ITrafficTools resultTrafficTools() { trafficTools.engine(); trafficTools.elding(); System.out.println("車輛完工..."); return trafficTools; } }
public class ShipBuilding extends AbstractTrafficToolsBuilding {
public ShipBuilding(){
this.trafficTools = new Ship();
}
@Override
public void buildingMaterial() {
System.out.println("找到安裝船的材料....");
}
@Override
public void buildingWorker() {
System.out.println("找到安裝船的工人...");
}
@Override
public ITrafficTools resultTrafficTools() {
trafficTools.engine();
trafficTools.elding();
System.out.println("船隻完工...");
return trafficTools;
}
}
交通工具的介面,一個發動機,一個燃料的方法。
public interface ITrafficTools {
public void engine();
public void elding();
}
兩個實現類:
public class Car implements ITrafficTools{
@Override
public void engine() {
System.out.println("安裝車的發動機...");
}
@Override
public void elding() {
System.out.println("給車加入燃料...");
}
}
public class Ship implements ITrafficTools {
@Override
public void engine() {
System.out.println("安裝船的發動機...");
}
@Override
public void elding() {
System.out.println("給船加入燃料...");
}
}
最後是我們的管理者:
public class Director {
public Director(AbstractTrafficToolsBuilding abstractTrafficToolsBuilding){
this.abstractTrafficToolsBuilding = abstractTrafficToolsBuilding;
}
private AbstractTrafficToolsBuilding abstractTrafficToolsBuilding;
public ITrafficTools construct(){
abstractTrafficToolsBuilding.buildingMaterial();
abstractTrafficToolsBuilding.buildingWorker();
return abstractTrafficToolsBuilding.resultTrafficTools();
}
}
客戶呼叫:
public class Client {
public static void main(String[] args) {
//得一個輛車
Director director = new Director(new CarBuilding());
ITrafficTools car = director.construct();
//得到一隻船
Director shipDirector = new Director(new ShipBuilding());
ITrafficTools ship = shipDirector.construct();
}
}
在客戶端,我們完全不知道在構建交通工具時發生了什麼(呼叫了哪此方法,設定了哪些屬性),我們只關心,我們可以得到自己想要的交通工具了。
這就是構建者模式。