设计模式之Build模式

Build模式

Posted by Simon on October 17, 2018

Build模式将构造与表示进行分离,不同的构造过程有不同的表示。

使用场景

① 当一个类,调用其不同方法/或者调用顺序不同时,需要产生不同的表示结果时。 ② 当初始化一个类,需要设置比较多成员参数时。 ③ 配置类

代码实现

实现的几个角色:
1.AbstractUser抽象类
2.User具体类
3.AbstractUserBuild抽象Build类
4.UserBuild具体的Build类
5.UserDirector构建过程类
6.IUser接口类(用于抽象动作,可有可无)
参考AlertDialog的Build构建模式,可对以上几个角色进行简化:
User具体类/UserParams成员参数类/UserBuild静态内部类/IUser
简单实现:
① User具体类/Build静态内部类

public class User implements IUser{

    UserParams params;

    protected User(){

    }

    public void setSkinColor(String skinColor) {
        this.params.skinColor = skinColor;
    }

    public void setAddress(String address) {
        this.params.address = address;
    }

    public void setLanguage(String language) {
        this.params.language = language;
    }

    @Override
    public void show() {
        System.out.print("我是"+params.address+"人 "+"我的皮肤是"+params.skinColor
        + " 我的母语是"+params.language);
    }

    public static class Build {

        UserParams params;

        public Build() {
            this.params = new UserParams();
        }

        public Build setSkinColor(String skinColor) {
            this.params.skinColor = skinColor;
            return this;
        }

        public Build setAddress(String address){
            this.params.address = address;
            return this;
        }

        public Build setLanguage(String language) {
            this.params.language = language;
            return this;
        }

        public User init(){
            final User user = new User();
            user.params = params;
            return user;
        }

    }

}

② UserParams成员参数类

public class UserParams {

    String skinColor;
    String address;
    String language;

}

③ IUser动作抽象接口

public interface IUser {

    void show();

}

调用链实现

public class BuildModeTest {

    public static void main(String[] args){

        new User.Build().setAddress("美国")
                .setLanguage("英文")
                .setSkinColor("白色")
                .init().show();

        System.out.print("\n");

        new User.Build().setAddress("中国")
                .setLanguage("中文")
                .setSkinColor("黄色")
                .init().show();
    }

}

优缺点

① Build模式将构建和表示分离开来,通过调用链方式,使代码简洁易懂。
② 封装性,使用者不需知道该类的具体细节。
③ 建造者独立,容易扩展。
【缺点】产生对于Build对象,销毁内存。