美文网首页Java基础
设计模式2.6 建造者模式

设计模式2.6 建造者模式

作者: 卢卡斯哔哔哔 | 来源:发表于2018-11-30 11:57 被阅读3次

    点击进入我的博客

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。它提供了一种创建对象的最佳方式。

    2.6.1 建造者结构

    建造者模式
    • Builder(抽象建造者):可以是一个抽象类或一个接口,规范产品对象的各个组成部分的建造。
    • ConcreteBuilder(具体建造者):它实现了Builder接口,给出一步一步的创建产品实例的操作,然后提供一个方法返回创建好的复杂产品对象。
    • Product(产品角色):如果是单个产品类,那么就是一个具体的产品;如果是多个产品类,那么就是一个抽象的类或接口。
    • ConcreteProduct(具体产品):当多个产品类时,继承抽象Product,也就是具体的要建造的复杂对象。值得注意的是,这些产品类不一定会有共同的接口。
    • Director(指挥者):它复杂安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在Director的方法中调用建造者对象的部件构造与装配方法,完成建造复杂对象的任务。

    2.6.2 建造者模式细节

    主要目的

    一个产品通常有不同的组成成分作为产品的零件,不同的产品可以有不同的零件,建造产品的过程是建造零件的过程。建造者模式将产品的结构和产品的零件建造过程对外隐藏起来,把对建造过程进行指挥的责任和具体建造零件的责任分割开来,达到责任划分和封装的目的。

    解决问题

    主要解决在开发过程中,有时需要创建一个复杂对象,通常由多个部分的子对象构成;由于复杂对象的多样性,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法需要保持稳定。

    使用场景
    1. 肯德基的产品很多,需要组成“套餐”。
    2. Java的StringBuilder
    省略角色
    1. 省略抽象建造者:如果只需要一个具体建造者,则可以省略抽象建造者。
    2. 省略指挥者:可以在具体建造者里边直接构造具体产品。
    3. 合并具体建造者和具体产品:在产品本身就是自己的建造者。
    优点
    1. 良好的封装性
    2. 具体建造类之间独立,扩展性好
    缺点
    • 如果产品比较多,可能会有很多的建造类。

    2.6.3 肯德基套餐案例

    public class Waiter {
        public static void main(String[] args) {
            KFCBuilder builder = new MexicanTwisterBuilder();
            builder.buildBeverage();
            builder.buildHamburger();
            builder.buildSnack();
            KFCCombo combo = builder.getCombo();
        }
    }
    
    // 套餐接口
    abstract class KFCCombo {
        private String hamburger;
        private String beverage;
        private String snack;
        // getters & setters
    }
    // 墨西哥鸡肉卷套餐
    class MexicanTwisterCombo extends KFCCombo {}
    
    // Builder接口
    interface KFCBuilder {
        void buildHamburger();
        void buildBeverage();
        void buildSnack();
        KFCCombo getCombo();
    }
    
    class MexicanTwisterBuilder implements KFCBuilder {
        private KFCCombo combo = new MexicanTwisterCombo();
        @Override
        public void buildHamburger() {
            combo.setHamburger("Mexican Twister");
        }
    
        @Override
        public void buildBeverage() {
            combo.setBeverage("Pepsi Cola");
        }
    
        @Override
        public void buildSnack() {
            combo.setSnack("Hot Wings");
        }
    
        @Override
        public KFCCombo getCombo() {
            return combo;
        }
    }
    

    2.6.4 builder内部类

    如果一个类有很多属性,此时为此类写一个Builder内部类,来辅助建造该类。

    class Phone {
        private String screen;
        private String camera;
        private String cpu;
        private String battery;
    
        public static Builder builder() {
            return new Builder();
        }
    
        public static class Builder {
            private Phone phone = new Phone();
    
            public Builder screen(String screen) {
                phone.screen = screen;
                return this;
            }
    
            public Builder camera(String camera) {
                phone.camera = camera;
                return this;
            }
    
            public Builder cpu(String cpu) {
                phone.cpu = cpu;
                return this;
            }
    
            public Builder battery(String battery) {
                phone.battery = battery;
                return this;
            }
    
            public Phone build() {
                return phone;
            }
        }
    }
    

    2.6.5 与其他模式的关系

    抽象工厂模式
    • 抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。
    • 而建造者模式则是要求按照规定建造产品,它的主要目的是通过组装零配件而产生一个新产品。
    • 换言之,抽象工厂模式在更加具体的维度上,而建造模式在一个更加宏观的维度上。
    策略模式
    • 事实上建造模式是策略模式的一种特殊情况,这两种模式的却别在于用意不同。
    • 建造模式适应于为客户端一点一点地建造新的对象。
    • 策略模式的目的是为算法提供抽象的接口。

    相关文章

      网友评论

        本文标题:设计模式2.6 建造者模式

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