设计模式——建造者模式

建造者模式是一种对象创建型模式,它将复杂对象的构建与表示分离,允许同样的构建过程创建不同的表示。文章通过对比工厂模式,解释了建造者模式如何分步骤构建对象,并提供了产品类、抽象建造者、具体建造者和指挥者的角色定义。示例展示了如何使用建造者模式创建CarProduct对象,以及在无需抽象建造者和指挥者时的简化应用。
摘要由CSDN通过智能技术生成

模式理解

建造者模式(Builder Pattern):建造者模式是一种对象创建型模式。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话理解起来太抽象了,现在结合工厂模式来理解建造者模式。

在工厂方式模式中,主要概念有工厂类(包含抽象工厂类及其子类)和产品类(包含抽象产品类及其子类)。一个具体工厂子类生产一个具体产品子类对象,工厂类在创建产品类对象的同时,获取需要初始化的对象属性并进行赋值,也就是在实例化对象时可以获取全部属性信息,工厂类一次性创建好产品类对象及内部属性。

在建造者模式中,在实例化产品类的对象时,并不一定拥有该实例化对象的全部属性信息。也就是对象创建与属性赋值分开,可以先将对象创建出来,然后逐步构建对象属性信息。建造者模式的主要意图是将类的构建逻辑转移到类的实例化之外,通常被用于需要多个步骤创建复杂对象的场景中。建造者模式关注每一个零部件的创建和组装过程,能够更细粒度的控制对象的创建过程和内部结构。

对象的构建与它的表示分离这句话的理解总结:对象的构建就是构建对象内部属性,表示就是对象,先简单实例化对象,后续详细构建对象内部属性,这就是建造者模式。而工厂模式就是一次性不分开的实例化对象和构建内部属性。

基本概念

在建造者设计模式中,有以下几个角色:

  1. 产品角色(Product):表示包含多个组成部件的复杂对象。由具体建造者来创建其各个部件。

  2. 抽象建造者(builder):一个抽象类或接口,包含创建产品各个部件的抽象方法,通常还包含一个返回复杂产品的方法。

  3. 具体建造者(ConcreteBuilder):实现 Builder 的接口,是构造和装配产品各个部件的具体实现。

  4. 指挥者(Director):调用建造者对象中的方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。对于客户来说,只需知道指挥者就可以了,就能构造复杂的对象,而不需要知道具体的构造过程。

    在这里插入图片描述

使用示例

  1. Product 产品类。包含多个组成部件复杂对象。

    public class CarProduct {
    	// 组成部件
        private String wheel;
        private String engine;
        private String chassis;
        // get和set方法........
    }
    
  2. Builder 抽象建造者,规范构造产品的方法。

    public interface CarBuilder {
        // 部件构建
        public abstract void buildWheel(String wheel);
        public abstract void buildEngine(String engine);
        public abstract void buildChassis(String chassis);
        // 返回产品
        public abstract CarProduct getCar();
    }
    
  3. ConcreteBuilder 具体建造者,具体实现 Builder 定义的方法。

    public class WCarConcreteBuilder implements CarBuilder{
    	// 创建对象
        CarProduct carProduct = new CarProduct();
        @Override
        public void buildWheel(String wheel) {
            carProduct.setWheel(wheel);
        }
        @Override
        public void buildEngine(String engine) {
            carProduct.setEngine(engine);
        }
        @Override
        public void buildChassis(String chassis) {
            carProduct.setChassis(chassis);
        }
        @Override
        public CarProduct getCar() {
            return carProduct;
        }
    }
    
  4. Director 指挥者,调用建造者方法顺序实施构造。

    public class Director {
        private CarBuilder builder;
        public Director(CarBuilder builder){
            this.builder = builder;
        }
        public CarProduct createCar(){
            // 指挥建造者构建部件以及组装顺序
            this.builder.buildChassis("先建地盘");
            this.builder.buildWheel("再装轮子");
            this.builder.buildEngine("最后装引擎");
            return this.builder.getCar();
        }
    }
    
  5. 客户类使用指挥者获取对象

    public class Client {
        public static void main(String[] args) {
            Director director = new Director(new WCarConcreteBuilder());
            CarProduct car = director.createCar();
            System.out.println(car);
        }
    }
    

建造者模式延展

如果系统中只需要一个具体建造者的话,可以省略掉抽象建造者,同时还可以省略指挥者,让具体建造者同时扮演建造者和指挥者。

  1. 省略抽象建造者和指挥者,具体建造者同时肩负建造者和指挥者的重任。

    public class WCarConcreteBuilder{
    
        CarProduct carProduct = new CarProduct();
    
        public void buildWheel(String wheel) {
            carProduct.setWheel(wheel);
        }
        public void buildEngine(String engine) {
            carProduct.setEngine(engine);
        }
        public void buildChassis(String chassis) {
            carProduct.setChassis(chassis);
        }
        public CarProduct getCar() {
            return carProduct;
        }
    	// 指挥建造对象
        public void createCar(){
            // 指挥建造者构建部件以及组装顺序
            buildChassis("先建地盘");
            buildWheel("再装轮子");
            buildEngine("最后装引擎");
        }
    }
    
  2. 客户端直接调用具体建造者获取对象。

    public class Client {
        public static void main(String[] args) {
            WCarConcreteBuilder wCarConcreteBuilder = new WCarConcreteBuilder();
            wCarConcreteBuilder.createCar();
            CarProduct car = wCarConcreteBuilder.getCar();
            System.out.println(car);
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值