设计模式-建造者模式


建造者模式的定义

*建造者(Builder)模式: * 指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式,它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成,它将变与不变想分离,即产品的组成部分是不变的,但是每一部分是可以灵活选择的

特点

  1. *优点: *
    • 各个具体的建造者相互独立,有利于系统的扩展
    • 客户端不必知道产品内部组成的细节,便于控制细节风险
  2. *缺点: *
    • 产品的组成部分必须相同,这限制了其使用范围
    • 如果产品的内部变化复杂,该模式会增加很多的建造者类
  3. 建造者模式和工厂模式的关注点不同: 建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用

模式的结构与实现

  1. 模式的结构

    • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件

    • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()

    • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法

    • 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息

    建造者模式结构图

  2. 模式的实现

    //产品角色:包含多个组成部件的复杂对象
    public class Product {
        private String partA;
        private String partB;
        private String partC;
        public void setPartA(String partA) {
            this.partA=partA;
        }
        public void setPartB(String partB) {
            this.partB=partB;
        }
        public void setPartC(String partC) {
            this.partC=partC;
        }
        public void show() {
            //显示产品的特性
        }
    }
    //抽象建造者:包含创建产品各子部件的抽象方法
    abstract class Builder {
        //创建产品对象
        protected Product product=new Product();
        public abstract void buildPartA();
        public abstract void buildPartB();
        public abstract void buildPartC();
        //返回产品对象
        public Product getResult() {
            return product;
        }
    }
    //具体建造者:实现了抽象建造者接口
    class ConcreteBuilder extends Builder {
        public void buildPartA() {
            product.setPartA("建造 PartA");
        }
        public void buildPartB() {
            product.setPartA("建造 PartB");
        }
        public void buildPartC() {
            product.setPartA("建造 PartC");
        }
    }
    //指挥者:调用建造者中的方法完成复杂对象的创建
    class Director {
        private Builder builder;
        public Director(Builder builder) {
            this.builder=builder;
        }
        //产品构建与组装方法
        public Product construct() {
            builder.buildPartA();
            builder.buildPartB();
            builder.buildPartC();
            return builder.getResult();
        }
    }
    //客户类
    public class Client {
        public static void main(String[] args) {
            Builder builder=new ConcreteBuilder();
            Director director=new Director(builder);
            Product product=director.construct();
            product.show();
        }
    }
  3. 实例

    /**
     * 建造者模式(Builder Pattern)
     * 当构造方法过多或参数过多时使用建造者模式,可以更好的创建对象
     * NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
     * .calories(100).sodium(35).carbohydrate(27).build();
     */
    public class NutritionFacts {
        private final int servingSize;
        private final int servings;
        private final int calories;
        private final int fat;
        private final int sodium;
        private final int carbohydrate;
        public static class Builder {
            // Required parameters
            private final int servingSize;
            private final int servings;
            // Optional parameters - initialized to default values
            private int calories = 0;
            private int fat = 0;
            private int sodium = 0;
            private int carbohydrate = 0;
            public Builder(int servingSize, int servings) {
                this.servingSize = servingSize;
                this.servings = servings;
            }
            public Builder calories(int val) {
                calories = val;
                return this;
            }
            public Builder fat(int val) {
                fat = val;
                return this;
            }
            public Builder sodium(int val) {
                sodium = val;
                return this;
            }
            public Builder carbohydrate(int val) {
                carbohydrate = val;
                return this;
            }
            public NutritionFacts build() {
                return new NutritionFacts(this);
            }
        }
        private NutritionFacts(Builder builder) {
            servingSize = builder.servingSize;
            servings = builder.servings;
            calories = builder.calories;
            fat = builder.fat;
            sodium = builder.sodium;
            carbohydrate = builder.carbohydrate;
        }
    }

文章作者: Bryson
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bryson !
评论
 上一篇
设计模式-代理模式 设计模式-代理模式
代理模式的定义 代理模式: 由于某些原因需要给某对象提供一个代理以控制对该对象的访问,这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介 特点 *优点: * 代理模式在客户端与目标对象之间起到一个中介作
2020-04-02
下一篇 
设计模式-抽象工厂模式 设计模式-抽象工厂模式
抽象工厂模式的定义 抽象工厂(Abstract Factory)模式: 是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构 抽象工厂模式是工厂方法模式的升级版本,
2020-03-28
  目录