美文网首页Android开发
Builder建造者模式

Builder建造者模式

作者: johnnycmj | 来源:发表于2017-09-18 15:28 被阅读36次

    建造者模式

    1 定义

    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    builder.png

    2通用代码

    • Product :产品类。通常是实现了模板方法。
    • Builder: 抽象创建者。规范产品的组建,一般由子类来具体实现。
    • ConcreateBuilder: 具体创建者,并返回一组创建好的对象。
    • Director: 负责安排已有模块顺序,并通知Builder开始创建。
    public class Product {
        public void doSomething(){
    
        }
    }
    
    public abstract class Builder {
    
        //设置产品的不同部分,以获得不同的产品
        protected abstract void builderPart1();
    
        protected abstract void builderPart2();
    
        //建造产品
        public abstract Product getProduct();
    }
    
    public class ConcreateBuilder extends Builder {
    
        private Product product = new Product();
    
        @Override
        protected void builderPart1() {
    
        }
    
        @Override
        protected void builderPart2() {
    
        }
    
        @Override
        public Product getProduct() {
            return product;
        }
    }
    
    public class Director {
        private Builder builder = new ConcreateBuilder();
    
        public Product getProductA(){
            builder.builderPart1();
            builder.builderPart2();
    
            return builder.getProduct();
        }
    }
    

    3适用场景

    • 相同方法,不同执行顺序产生不同事件结果。
    • 多个零部件,都可以装配到一个对象中,但是产生的运行结果不相同。
    • 产品类非常复杂,或者产品类调用顺序不同产生不同的结果。
    • 当初始化一个对象非常复杂,如参数多,且参数都有默认值。

    4 特点

    在现实开发过程,Director这个角色经常会被省略。而直接使用一个Builder来进行对象的组装,这个Builder通常为链式调用,它的关键是每个set方法都返回自身,即return this,这样setter就可以链式调用。

    new Builder().setA("A").setB("B").setC("C").create();

    5 优点

    • 良好的封装性,使用建造者模式使客户端不必知道产品内部具体的实现。
    • 建造者独立,易于扩展。

    6 缺点

    会产生多于的Builder对象以及Director对象,消耗内存。

    7 链式调用Builder模式

    CustomerDialog.java

    public class CustomerDialog {
    
        private String title;
        private String message;
        private String button;
    
        public void setTitle(String title){
            this.title  = title;
        }
    
        public void setMessage(String message){
            this.message = message;
        }
    
        public void setButton(String button){
            this.button = button;
        }
    
        @Override
        public String toString() {
            return "This dialog is [ title="+title+" , message="+message+" , button="+button+"]";
        }
    
        public String show(){
            return this.toString();
        }
    }
    

    DialogBuilder.java

    public class DialogBuilder {
    
        private CustomerDialog dialog;
    
    
        public DialogBuilder(){
            dialog = new CustomerDialog();
        }
    
        public DialogBuilder setTitle(String title){
            dialog.setTitle(title);
            return this;
        }
    
        public DialogBuilder setMessage(String message) {
            dialog.setMessage(message);
            return this;
        }
    
        public DialogBuilder setButton(String button) {
            dialog.setButton(button);
            return this;
        }
    
        public CustomerDialog create(){
            return dialog;
        }
    }
    

    DisplayDialog.java

    public class DisplayDialog {
    
        public static DialogBuilder with(){
            return new DialogBuilder();
        }
    }
    
    @Test
    public void testMain1(){
        CustomerDialog dialog =
                DisplayDialog.with()
                .setTitle("Dialog test")
                .setMessage("Dialog content")
                .setButton("Dialog button")
                .create();
    
        System.out.println(dialog.show());
    
    }
    

    相关文章

      网友评论

        本文标题:Builder建造者模式

        本文链接:https://www.haomeiwen.com/subject/gsdbsxtx.html