设计模式 之 创建型模式 <一> 建造者模式(Builder Pattern)

 建造者模式角色:
● Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接 口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;

                                           另一 类方法是getResult(),它们 用于返回复杂对象。Builder既可以是抽象类,也可以是接口。


●ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方 法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。


●Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品 的内部表示并定义它的装配过程。


● Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽 象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装 配方法,

                                     完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建 造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),

                                    然后通过指挥 者类的构造函数或者Setter方法将该对象传入指挥者类中。

 

练习:Sunny软件公司欲开发一个视频播放软件,为了给用户使用提供方便,该播放软件提供多种界面显示模式,如完整模式、精简模式、记忆模式、网络模式等。在不同的显示模式下主界面的组成元素有所差异,如在完整模式下将显示菜单、播放列表、主窗口、控制条等,在精简模式下只显示主窗口和控制条,而在记忆模式下将显示主窗口、控制条、收藏列表等。尝试使用建造者模式设计该软件。

 

 

 

 1.Product(产品角色

 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 }
View Code

 

 2.Builder(抽象建造者)

 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 }
View Code

 

3.ConcreteBuilder(具体建造者)

/**
 * 具体建造者
 *
 * 完整模式
 */

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("显示播放进度条");
    }
}
View Code

 

4.Director(指挥者)

/**
 *  指挥者
 */

public class ViewController {
    public View construct(ViewBuilder viewBuilder){
         viewBuilder.builderMainWindow();
         viewBuilder.builderMenu();
         viewBuilder.builderPlaylist();
         viewBuilder.builderProgressBar();
         return viewBuilder.createView();
    }
}
View Code

 

5.测试

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());

    }
}
View Code

 

 

 

 

 


posted @ 2020-07-20 20:25  zp007  阅读(276)  评论(0编辑  收藏  举报