建造者模式

2020-12-29  本文已影响0人  梦星夜雨

前言

建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

建造者模式的实现

public final class House {
    private String color;
    private String size;
    private String height;
    public House(Builder builder) {
        // TODO Auto-generated constructor stub
        this.color = builder.color;
        this.size = builder.size;
        this.height = builder.height;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public String getSize() {
        return size;
    }
    public void setSize(String size) {
        this.size = size;
    }
    public String getHeight() {
        return height;
    }
    public void setHeight(String height) {
        this.height = height;
    }
// 构建类
    public static class Builder{
        private String color;
        private String size;
        private String height;
        
        public Builder() {
          this.color = "白色";
          this.height = "2";
        }
        
        public Builder addColor(String color) {
            this.color = color;
            return this;
        }
        public Builder addSize(String size) {
            this.size = size;
            return this;
        }
        public Builder addHeight(String height) {
            this.height = height;
            return this;
        }
        public House build() {
            if (size == null) {
                throw new NullPointerException("房屋大小不能为空");
            }
            return new House(this);
        }
    }
    @Override
    public String toString() {
        return "House [color=" + color + ", size=" + size + ", height=" + height + "]";
    }
    
}

建造者模式实质上就是一个复制的过程,在创建内部类Builder时,可以对部分参数设置默认值,这样就不用对每个参数进行赋值,然后采用链式赋值的方式进行参数的初始化,最后调用build()方法得到所需要的对象。

public class HouseTest {

    public static void main(String args[]) {
        House house = new House.Builder().addColor("红色").addSize("120").build();
        System.out.println(house);
    }
}

上面是构建者模式的调用。

优点:
1.将一个复杂对象的创建过程封装起来。
2.允许对象通过多个步骤创建,并且可以改变过程。
3。向客户隐藏产品内部表现。
4.产品的实现可以被替换,因为客户只看到一个抽象的接口。
缺点:
1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

建造者模式与抽象工厂模式的比较:
与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。

上一篇 下一篇

猜你喜欢

热点阅读