建造者模式
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立於其他對象的。
介紹
意圖:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
主要解決:主要解決在軟件系統中,有時候面臨着”一個複雜對象”的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定。
何時使用:一些基本部件不會變,而其組合經常變化的時候。
如何解決:將變與不變分離開。
關鍵代碼:建造者:創建和提供實例,導演:管理建造出來的實例的依賴關係。
應用實例: 1、JAVA 中的 StringBuilder;2、EventBus對象的創建。
優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。
缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。
使用場景: 1、需要生成的對象具有複雜的內部結構。 2、需要生成的對象內部屬性本身相互依賴。
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。
框架
在建造者模式中有四個成員:
- Director:與用戶直接交互,掌控Build的順序,調用Builder中創建對象的方法;
- Builder:各對象創建的方法類,實現ConcreteBuilder接口中定義的創建方法;
- ConcreteBuilder:對象創建接口,將產品各部件的創建方法抽象到接口中;
- Product:產品類,即最終要build的生成物。
實例
接下來通過一個實例來演示建造者模式的工作方法,該實例通過建造者模式創建一個完整的IPhone對象:
1、定義產品類 IPhone
IPhone中有Screen、MainBroad、CPU、Camera四個零件(此處簡化都爲String對象,在複雜情況下每個部件都應該是一個類,並且有自己的創建方法和順序)。
/**
* Created by wise on 2018/6/14.
*/
public class IPhone {
private String mScreen;
private String mMainBroad;
private String mCPU;
private String mCamera;
public String getScreen() {
return mScreen;
}
public void setScreen(String screen) {
mScreen = screen;
}
public String getMainBroad() {
return mMainBroad;
}
public void setMainBroad(String mainBroad) {
mMainBroad = mainBroad;
}
public String getCPU() {
return mCPU;
}
public void setCPU(String CPU) {
mCPU = CPU;
}
public String getCamera() {
return mCamera;
}
public void setCamera(String camera) {
mCamera = camera;
}
}
2、抽象IPhoneBuild接口(ConcreteBuilder角色)
IPhoneBuild中把建造IPhone的過程抽象爲接口,共有5個方法,分別是各模塊的建造方法和最後生成物的建造方法。
/**
* Created by wise on 2018/6/14.
*/
public interface IPhoneBuild {
public void buildScreen();
public void buildMainBroad();
public void buildCPU();
public void buildCamera();
public IPhone buildIPhone();
}
3、IPhoneBuild接口實現(Builder角色)
然後在IPhoneBuilder中對上述接口進行具體實現,各模塊和生成物的詳細建造邏輯在這裏實現,此處扮演Builder的角色。
/**
* Created by wise on 2018/6/14.
*/
public class IPhoneBuilder implements IPhoneBuild {
private IPhone mIPhone;
public IPhoneBuilder() {
mIPhone = new IPhone();
}
@Override
public void buildScreen() {
Log.d("build","Screen has been build");
mIPhone.setScreen("OLED");
}
@Override
public void buildMainBroad() {
Log.d("build","MainBroad has been build");
mIPhone.setMainBroad("Samsung");
}
@Override
public void buildCPU() {
Log.d("build","CPU has been build");
mIPhone.setCPU("Snapdragon");
}
@Override
public void buildCamera() {
Log.d("build","Camera has been build");
mIPhone.setCamera("Sony");
}
@Override
public IPhone buildIPhone() {
return mIPhone;
}
}
4、IPhoneDirect(Director角色)
IPhoneDirect爲直接與用戶交互的類,此處調用了各模塊的建造方法,並且在這裏控制模塊建造與否、順序邏輯,並最終組裝成生成物返回給用戶。
/**
* Created by wise on 2018/6/14.
*/
public class IPhoneDirect {
private IPhoneBuilder mIPhoneBuilder;
public IPhoneDirect(IPhoneBuilder iPhoneBuilder){
mIPhoneBuilder = iPhoneBuilder;
}
public IPhone build(){
mIPhoneBuilder.buildCamera();
mIPhoneBuilder.buildCPU();
mIPhoneBuilder.buildMainBroad();
mIPhoneBuilder.buildScreen();
return mIPhoneBuilder.buildIPhone();
}
}
5、實例調用
此處演示在Activity中通過Direct對象完成一個IPhone對象的創建過程,在實際應用中上述的每一環節都要比此Demo中所寫的要複雜很多,尤其是每個模塊的建造過程和最終在Director中建造、組裝的順序是Build模式最獨特和關鍵的特點。
public class BuildActivity extends AppCompatActivity {
private IPhone myIPhone;
private IPhoneDirect mIPhoneDirect;
private TextView tv_ShowInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_build);
tv_ShowInfo = (TextView) findViewById(R.id.tv_showInfo);
mIPhoneDirect = new IPhoneDirect(new IPhoneBuilder());
myIPhone = mIPhoneDirect.build();
tv_ShowInfo.setText(myIPhone.getCamera() + "," + myIPhone.getCPU() + "," + myIPhone.getMainBroad() + "," + myIPhone.getScreen());
}
}