设计模式之建造者模式

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,也叫生成器模式。
建造者模式通用组成:
首先定义一个抽象的产品类,可以定义一些抽象方法

public abstract class BaseModel {
    protected abstract void method1();
    protected abstract void method2();
    protected abstract void method3();
}

两个具体的产品实现类

public class ProductA extends BaseModel {
    @Override
    protected void method1() {
        System.out.println("ProductA method 1");
    }
    @Override
    protected void method2() {
        System.out.println("ProductA method 2");
    }
    @Override
    protected void method3() {
        System.out.println("ProductA method 3");
    }
}

public class ProductB extends BaseModel {
    @Override
    protected void method1() {
        System.out.println("ProductB method 1");
    }
    @Override
    protected void method2() {
        System.out.println("ProductB method 2");
    }
    @Override
    protected void method3() {
        System.out.println("ProductB method 3");
    }
}

抽象的建造者类,用于规范产品的组建,由其子类进行实现

public abstract class ModelBuilder {
    public abstract BaseModel getModel();
}

具体的建造者类,实现抽象类定义的方法,返回具体的建造对象

public class ProductABuilder extends ModelBuilder {
    ProductA productA = new ProductA();
    @Override
    public BaseModel getModel() {
        productA.method1();
        productA.method2();
        productA.method3();
        return this.productA;
    }
}

public class ProductBBuilder extends ModelBuilder {
    ProductB productB = new ProductB();
    @Override
    public BaseModel getModel() {
        productB.method3();
        productB.method2();
        productB.method1();
        return this.productB;
    }
}

Director导演类,中间类,负责通知具体建造类建造对象,客户端直接通过导演类封装的方法直接建造对象

public class Director {
    private ProductABuilder productABuilder = new ProductABuilder();
    private ProductBBuilder productBBuilder = new ProductBBuilder();

    public ProductA getProductA(){
        return (ProductA) this.productABuilder.getModel();
    }

    public ProductB getProductB(){
        return (ProductB) this.productBBuilder.getModel();
    }
}

客户端调用类

public class Client {
    public static void main(String[] args) {
        Director director = new Director();

        ProductA productA = director.getProductA();
        System.out.println(productA);

        ProductB productB = director.getProductB();
        System.out.println(productB);
    }
}

应用

优点

  • 封装性。可以使客户端不必知道产品内部的组成细节
  • 建造者独立,容易扩展。各个具体建造者之间相互独立
  • 便于控制细节。由于具体的建造者是独立的,可以对其进行细化,而对其它模块不产生影响

使用场景

  • 相同的方法,不同的执行顺序,产生不同的执行结果时,可以使用该模式。
  • 多个零部件都可以组装到一个对象中,但是产生的运行结果不相同时,可以使用该模式。
  • 产品类比较复杂,或者产品类的调用顺序不同产生不同的影响,可以使用该模式。
  • 在对象创建过程中使用到其它对象,这些对象在产品对象的创建过程中不易得到,也可以使用该模式进行封装该对象的创建过程,该场景只能作为一种补偿方法使用。

补充

建造者模式关注的是产品的类型以及具体细节(如方法的调用顺序),这是与工厂模式最大的不同点;工厂模式重点是创建对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值