返回顶部

创建型之【建造者模式】

一、使用场景

建造者(Builder)模式创建的复杂对象,其产品的各个部分经常面临着剧烈的变化,但将他们组合在一起的算法却相对稳定,所以他们通常在以下场合使用。

1、创建的对象比较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。

2、创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

二、案例

以创建共享单车为例,生产自行车是一个复杂的过程,它包含了车架、车座等组件的生产。而车座又有炭纤维、铝合金等材质的,车座有橡胶、真皮等材质。对于自行车的生产就可以使用建造者模式。

/**
 * @Description:产品对象
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午12:37
 */
public class Bike {
    private String frame;// 车架
    private String seat;// 车座

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public String getSeat() {
        return seat;
    }

    public void setSeat(String seat) {
        this.seat = seat;
    }
}
/**
 * @Description:
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午12:39
 */
public abstract class Builder {
// 声明Bike类型的变量,并进行赋值
    protected  Bike bike=new Bike();

    public  abstract  void BuildFrame();
    public  abstract  void BuildSeat();

    // 构建自行车的方法
    public  abstract  Bike CreateBike();
}
/**
 * @Description:摩拜单车
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午12:44
 */
public class MobileBuilder extends Builder {
    @Override
    public void BuildFrame() {
        bike.setFrame("炭纤维车架");

    }

    @Override
    public void BuildSeat() {
        bike.setSeat("真皮车座");
    }

    @Override
    public Bike CreateBike() {
        return bike;
    }
}
/**
 * @Description:OfO共享单车
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午2:41
 */
public class OfoBuilder extends Builder{
    @Override
    public void BuildFrame() {
        bike.setFrame("ofo车架");
    }

    @Override
    public void BuildSeat() {
        bike.setSeat("ofo车座");
    }

    @Override
    public Bike CreateBike() {
        return bike;
    }
}
/**
 * @Description:指挥者类
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午2:44
 */
public class Director {
    private  Builder builder;
    // 声明builder类型的变量
    public Director(Builder builder)
    {
        this.builder=builder;
    }
    // 组装自行车的功能
    public  Bike Construct()
    {
        builder.BuildFrame();
        builder.BuildSeat();
        return  builder.CreateBike();
    }
}
/**
 * @Description:测试案例
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午2:48
 */
public class BuilderDemo {
    public static void main(String[] args) {
        // 创建指挥者对象
        Director director = new Director(new MobileBuilder());
        // 让指挥者指挥组装自行车
        Bike bike = director.Construct();

        System.out.println(bike.getFrame());
        System.out.println(bike.getSeat());
    }
}

三、模式扩展

 建造者模式除了上面的用途外,在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会很差,而且很容易引入错误,此时就可以利用建造者模式进行重构。

/**
 * @Description:手机类
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午4:12
 */
public class Phone {

    private String Cpu;
    private String Screen;
    private String Memory;

    // 构造函数私有
    private Phone(Builder builder) {
        this.Cpu = builder.Cpu;
        this.Screen = builder.Screen;
        this.Memory = builder.Memory;

    }

    public static final class Builder {
        private String Cpu;
        private String Screen;
        private String Memory;

        public Builder Cpu(String cpu) {
            this.Cpu = cpu;
            return this;
        }

        public Builder Screen(String screen) {
            this.Screen = screen;
            return this;
        }

        public Builder Memory(String memory) {
            this.Memory = memory;
            return this;
        }

        // 使用构建者创建phone对象  通过构建者对象获取手机对象
        public Phone Build() {
            return new Phone(this);
        }
    }

    @Override
    public String toString() {
        return "Phone{" +
                "Cpu='" + Cpu + '\'' +
                ", Screen='" + Screen + '\'' +
                ", Memory='" + Memory + '\'' +
                '}';
    }
}
**
 * @Description:手机测试类
 * @Author: Xiaohemaio
 * @Date: 20/3/2022 下午4:34
 */
public class BuilderPhoneDemo {
    public static void main(String[] args) {

        Phone phone = new Phone.Builder()
                .Cpu("I7英特尔")
                .Screen("戴尔屏幕")
                .Memory("SSD")
                .Build();

        System.out.println(phone);
    }
}

 

posted @ 2022-03-20 16:37  SportSky  阅读(53)  评论(0编辑  收藏  举报
作者:SportSky 出处: http://www.cnblogs.com/sportsky/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。