设计模式 之 创建型模式 <一> 建造者模式(Builder Pattern)
建造者模式角色:
● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接 口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;
另一 类方法是getResult(),它们 用于返回复杂对象。Builder既可以是抽象类,也可以是接口。
●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方 法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。
●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品 的内部表示并定义它的装配过程。
● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽 象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,
完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建 造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),
然后通过指挥 者类的构造函数或者Setter方法将该对象传入指挥者类中。
练习:Sunny软件公司欲开发一个视频播放软件,为了给用户使用提供方便,该播放软件提供多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。尝试使用建造者模式设计该软件。
1.Product(产品角色
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * Product(产品角色) 3 */ 4 public class View { 5 //菜单 6 private String menu=""; 7 //播放列表 8 private String playlist=""; 9 //主窗口 10 private String mainWindow; 11 //进度条 12 private String progressBar; 13 14 public String getMenu() { 15 return menu; 16 } 17 18 public void setMenu(String menu) { 19 this.menu = menu; 20 } 21 22 public String getPlaylist() { 23 return playlist; 24 } 25 26 public void setPlaylist(String playlist) { 27 this.playlist = playlist; 28 } 29 30 public String getMainWindow() { 31 return mainWindow; 32 } 33 34 public void setMainWindow(String mainWindow) { 35 this.mainWindow = mainWindow; 36 } 37 38 public String getProgressBar() { 39 return progressBar; 40 } 41 42 public void setProgressBar(String progressBar) { 43 this.progressBar = progressBar; 44 } 45 }
2.Builder(抽象建造者)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * Builder(抽象建造者) 3 */ 4 5 public abstract class ViewBuilder { 6 protected View view=new View(); 7 public abstract void builderMenu(); 8 public abstract void builderPlaylist(); 9 public abstract void builderMainWindow(); 10 public abstract void builderProgressBar(); 11 public View createView(){ 12 return view; 13 } 14 }
3.ConcreteBuilder(具体建造者)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 具体建造者 * * 完整模式 */ public class CompleteModeViewBuilder extends ViewBuilder { @Override public void builderMenu() { view.setMenu("显示菜单"); } @Override public void builderPlaylist() { view.setPlaylist("显示播放列表"); } @Override public void builderMainWindow() { view.setMainWindow("显示主窗口"); } @Override public void builderProgressBar() { view.setProgressBar("显示播放进度条"); } } /** * 具体建造者 * * 网络模式 */ public class NetworkModeViewBuilder extends ViewBuilder { @Override public void builderMenu() { } @Override public void builderPlaylist() { view.setPlaylist("显示播放列表"); } @Override public void builderMainWindow() { view.setMainWindow("显示主窗口"); } @Override public void builderProgressBar() { view.setProgressBar("显示播放进度条"); } } /** * 具体建造者 * * 精简模式 */ public class SimplifiedModeViewBuilder extends ViewBuilder{ @Override public void builderMenu() { } @Override public void builderPlaylist() { } @Override public void builderMainWindow() { view.setMainWindow("显示主窗口"); } @Override public void builderProgressBar() { view.setProgressBar("显示播放进度条"); } }
4.Director(指挥者)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 指挥者 */ public class ViewController { public View construct(ViewBuilder viewBuilder){ viewBuilder.builderMainWindow(); viewBuilder.builderMenu(); viewBuilder.builderPlaylist(); viewBuilder.builderProgressBar(); return viewBuilder.createView(); } }
5.测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Main { static String TAG="Main"; public static void test(){ ViewController viewController=new ViewController(); //创建完整模式下的视图 View view= viewController.construct(new CompleteModeViewBuilder()); Log.e(TAG,""+view.getMainWindow()); Log.e(TAG,""+view.getMenu()); Log.e(TAG,""+view.getPlaylist()); Log.e(TAG,""+view.getProgressBar()); //创建精简模式下的视图 view= viewController.construct(new SimplifiedModeViewBuilder()); Log.e(TAG,""+view.getMainWindow()); Log.e(TAG,""+view.getMenu()); Log.e(TAG,""+view.getPlaylist()); Log.e(TAG,""+view.getProgressBar()); } }