构建器/生成器模式Builder

Builder模式是一种设计模式,用于将复杂对象的构建与表示相分离,使得相同的构建过程可以创建不同的表示。在示例中,通过不同的ConcreteBuilder实现了披萨和产品的不同构建过程,Director负责协调构建。这种模式适用于创建过程独立于对象组成部分以及它们的装配方式的情况。
摘要由CSDN通过智能技术生成

1.意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.结构
在这里插入图片描述
Builder为创建一个Product对象的各个部件指定抽象接口。
ConcreteBuilder实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,提供一个检索产品的接口。
Director构造一个使用Builder接口的对象。
Product表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。包含定义组成组件的类,包括将这些组件装配成最终产品的接口。
3.适用性
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
4.常见案例:一个产品构造(组成不同)
代码案例一
某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类披萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter)调度厨师制作套餐。现采用生成器(Builder)模式实现制作过程。
软件设计师考试2017年上半年下午题第6题

public class Builder1 {
    public static void main(String[] args) {
        Waiter waiter = new Waiter();
        //生产一个夏威夷披萨
        PizzaBuilder huwaiianPizzaBuilder = new HawaiianPizzaBuilder();
        waiter.setPizzaBuilder(huwaiianPizzaBuilder);
        waiter.construct();
        System.out.println("pizza:" + waiter.getPizza());
    }
}
class Pizza{
    private String parts;
    public void setParts(String parts){
        this.parts = parts;
    }
    public String getParts(){
        return this.parts;
    }
    @Override
    public String toString() {
        return parts;
    }
}
abstract class PizzaBuilder{
    protected Pizza pizza;
    public Pizza getPizza(){
        return pizza;
    }
    public void createNewPizza(){
        pizza = new Pizza();
    }
    public abstract void buildParts();
}
class HawaiianPizzaBuilder extends PizzaBuilder{//夏威夷披萨
    @Override
    public void buildParts() {
        pizza.setParts("cross + mild + ham & pineapple");
    }
}
class SpicyPizzaBuilder extends PizzaBuilder{//意大利披萨
    @Override
    public void buildParts() {
        pizza.setParts("panbaked + hot + pepperoni & salami");
    }
}
class Waiter{
    private PizzaBuilder pizzaBuilder;
    public void setPizzaBuilder(PizzaBuilder pizzaBuilder){
        //设置构建器
        this.pizzaBuilder = pizzaBuilder;
    }
    public Pizza getPizza(){
        return pizzaBuilder.getPizza();
    }
    public void construct(){
        //构造
        pizzaBuilder.createNewPizza();
        pizzaBuilder.buildParts();
    }
}

运行结果
在这里插入图片描述
代码案例二
生成器(Builder)模式的意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
软件设计师考试2018年上半年下午题第6题

public class Builder2 {
    public static void main(String[] args) {
        Director director1 = new Director(new ConcreateBuilder1());
        //产品1生产:partA1+partB1
        director1.construct();
        Director director2 = new Director(new ConcreateBuilder2());
        //产品2生产:partA2+partB2
        director2.construct();
    }
}
class Product{
    private String partA;
    private String partB;
    public Product(){

    }
    public void setPartA(String s){
        partA = s;
    }
    public void setPartB(String s){
        partB = s;
    }
    public String getPartA() {
        return partA;
    }
    public String getPartB() {
        return partB;
    }
}
interface Builder{
    void buildPartA();
    void buildPartB();
    Product getResult();
}
class ConcreateBuilder1 implements Builder{
    private Product product;
    public ConcreateBuilder1(){
        product = new Product();
    }
    @Override
    public void buildPartA() {
        product.setPartA("component A1");
    }
    @Override
    public void buildPartB() {
        product.setPartB("component B1");
    }
    @Override
    public Product getResult() {
        System.out.println(product.getPartA()+"||"+product.getPartB());
        return product;
    }
}
class ConcreateBuilder2 implements Builder{

    private Product product;
    public ConcreateBuilder2(){
        product = new Product();
    }
    @Override
    public void buildPartA() {
        product.setPartA("component A2");
    }
    @Override
    public void buildPartB() {
        product.setPartB("component B2");
    }
    @Override
    public Product getResult() {
        System.out.println(product.getPartA()+"||"+product.getPartB());
        return product;
    }
}
class Director{
    private Builder builder;
    public Director (Builder builder){
        this.builder = builder;
    }
    public void construct(){
        builder.buildPartA();
        builder.buildPartB();
        Product product = builder.getResult();
    }
}

运行结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值