Java设计模式之建造者模式(Builder模式)

Java设计模式之建造者模式(Builder模式)

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

使用Builder模式来替代多参数构造函数是一个比较好的实践法则。

场景

车分很多种如:

  • 汽车:名字,价格,有发动机,有棚子
  • 电动三轮车:名字,价格,有棚子
  • 自行车:名字,价格,不堵车

其实为每个车写一个构造函数也可以实现,但是当车子多了,就不便于维护了。创建者模式就是解决这一类问题

应用举例

定义一个多功能的车

/**
 * Created by yunzhao.liu on 2017/12/27
 */

public class Car {

    private String name;//名字
    private int price;//价格
    private boolean isTrafficjam;//堵车
    private boolean isHaveEngine;//发动机
    private boolean isHaveShed;//棚子

    public static class Builder {
        private String name;//名字
        private int price;//价格
        private boolean isTrafficjam;//堵车
        private boolean isHaveEngine;//发动机
        private boolean isHaveShed;//棚子

        // 构建的步骤
        public Builder() {
        }

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setPrice(int price) {
            this.price = price;
            return this;
        }

        public Builder setTrafficjam(boolean trafficjam) {
            isTrafficjam = trafficjam;
            return this;
        }

        public Builder setHaveEngine(boolean haveEngine) {
            isHaveEngine = haveEngine;
            return this;
        }

        public Builder setHaveShed(boolean haveShed) {
            isHaveShed = haveShed;
            return this;
        }

        public Car build() { // 构建,返回一个新对象
            return new Car(this);
        }
    }

    private Car(Builder b) {
        name = b.name;
        price = b.price;
        isTrafficjam = b.isTrafficjam;
        isHaveEngine = b.isHaveEngine;
        isHaveShed = b.isHaveShed;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", isTrafficjam=" + isTrafficjam +
                ", isHaveEngine=" + isHaveEngine +
                ", isHaveShed=" + isHaveShed +
                '}';
    }
}

测试类

/**
 * Created by yunzhao.liu on 2017/12/27
 * 测试类
 */

public class TestBuilder {

    public static void main(String[] args) {
        //奥迪A6
        Car aodi = new Car.Builder()
                .setName("奥迪A6")
                .setPrice(200000)
                .setTrafficjam(true)
                .setHaveEngine(true)
                .setHaveShed(true)
                .build();
        String s1 = aodi.toString();
        System.out.println(s1);
        //三轮车
        Car tricycle = new Car.Builder()
                .setName("三轮车")
                .setPrice(2500)
                .setHaveEngine(true)
                .setHaveShed(true)
                .build();
        String s2 = tricycle.toString();
        System.out.println(s2);

        //自行车
        Car bicycle = new Car.Builder()
                .setName("自行车")
                .setPrice(300)
                .setTrafficjam(false)
                .build();

        String s3 = bicycle.toString();
        System.out.println(s3);
    }
}

你可能感兴趣的:(算法)