美文网首页
建造者模式

建造者模式

作者: 潜心之力 | 来源:发表于2020-08-07 09:11 被阅读0次

一、模式简介

定义:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
场景:创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

  • 角色结构:
  • 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个滅部件。
  • 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法。
  • 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  • 指挥官(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

二、经典模式实现

定义食品属性接口、抽象食品属性类、具体食品属性类

public interface Food { -> 产品角色
    String name(); -> 名称
    Double price(); -> 价格
    Pack pack(); -> 包装
}

public abstract class AbstractHamburg implements Food { -> 抽象建造者
    @Override
    public abstract String name();

    @Override
    public abstract Double price();

    @Override
    public Pack pack() {
        return new Paper();
    }
}

public class ChickenHamburg extends AbstractHamburg { -> 具体建造者
    @Override
    public String name() {
        return "炸鸡汉堡";
    }

    @Override
    public Double price() {
        return 15.00;
    }
}

public abstract class AbstractCoke implements Food { -> 抽象建造者
    @Override
    public abstract String name();

    @Override
    public abstract Double price();

    @Override
    public Pack pack() {
        return new Bottle();
    }
}

public class CocaCola extends AbstractCoke { -> 具体建造者
    @Override
    public String name() {
        return "可口可乐";
    }

    @Override
    public Double price() {
        return 5.00;
    }
}

public class PepsiCola extends AbstractCoke { -> 具体建造者

    @Override
    public String name() {
        return "百事可乐";
    }

    @Override
    public Double price() {
        return 5.00;
    }
}

定义食品包装接口、具体包装实现类

public interface Pack { -> 抽象建造者
    String pack();
}

public class Bottle implements Pack {  -> 具体建造者
    @Override
    public String pack() {
        return "瓶装";
    }
}

public class Paper implements Pack { -> 具体建造者
    @Override
    public String pack() {
        return "纸装";
    }
}

定义套餐选择方式

public class Meal {
    private List<Food> list = new ArrayList<>();

    public boolean addFood(Food food) {
        return list.add(food);
    }

    public boolean removeFood(Food food) {
        return list.remove(food);
    }

    public Double price() {
        BigDecimal decimal = BigDecimal.ZERO;
        for (int i = 0; i < list.size(); i++) {
            decimal = decimal.add(BigDecimal.valueOf(list.get(i).price()));
        }
        return decimal.doubleValue();
    }

    public void display() {
        for (int i = 0; i < list.size(); i++) {
            Food food = list.get(i);
            System.out.println(food.pack().pack() + " " + food.name() + " " + food.price());
        }
    }
}

public class MealBuilder { -> 指挥官
    public Meal ChickenCoca() {
        Meal meal = new Meal();
        meal.addFood(new ChickenHamburg());
        meal.addFood(new CocaCola());
        return meal;
    }

    public Meal ChickenPepsi() {
        Meal meal = new Meal();
        meal.addFood(new ChickenHamburg());
        meal.addFood(new PepsiCola());
        return meal;
    }
}

选择套餐

MealBuilder builder = new MealBuilder();
Meal mealChickenCoca = builder.ChickenCoca();
mealChickenCoca.display();

Meal mealChickenPepsi = builder.ChickenPepsi();
mealChickenPepsi.display();

三、变种模式实现

套餐构造方法设置私有,通过内部提供的构造器完成实例化

public class Meal {
    private List<Food> list = new ArrayList<>();
    
    public Double price() {
        BigDecimal decimal = BigDecimal.ZERO;
        for (int i = 0; i < list.size(); i++) {
            decimal = decimal.add(BigDecimal.valueOf(list.get(i).price()));
        }
        return decimal.doubleValue();
    }

    public void display() {
        for (int i = 0; i < list.size(); i++) {
            Food food = list.get(i);
            System.out.println(food.pack().pack() + " " + food.name() + " " + food.price());
        }
    }

    private Meal(MealBuilder builder) {
        if(builder.list != null){
            this.list = builder.list;
        }
    }

    public static class MealBuilder {
        private List<Food> list = new ArrayList<>();

        public MealBuilder CocaCola() {
            list.add(new CocaCola());
            return this;
        }

        public MealBuilder PepsiCola() {
            list.add(new PepsiCola());
            return this;
        }

        public MealBuilder ChickenHamburg() {
            list.add(new ChickenHamburg());
            return this;
        }

        public Meal build() {
            return new Meal(this);
        }
    }
}

选择套餐

Meal.MealBuilder builder = new Meal.MealBuilder();
Meal meal = builder.CocaCola().PepsiCola().ChickenHamburg().build();
meal.display();

相关文章

  • Builder Pattern in Java

    建造者模式:建造者模式定义建造者模式应用场景实现案例Jdk中的建造者模式建造者模式的优点建造者模式的缺点 建造者模...

  • 设计模式(4) 建造者模式

    什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与...

  • 建造者模式(部件构造)

    目录 建造者模式的理念 从 POJO 到建造者模式的思考 怎么来实现建造者模式 建造者模式在Android源码中的...

  • 【设计模式】之建造者Builder模式

    建造者模式 什么是建造者模式? 建造者模式属于创建型模式的一员,可以控制对象的实例化过程。建造者模式简化了复杂对象...

  • 建造者模式

    一、建造者模式介绍 二、建造者模式代码实例

  • 建造者模式

    建造者模式 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和...

  • 建造者模式:深入理解建造者模式 ——组装复杂的实例

    目录: 一 建造者模式介绍 1.1 定义 1.2 为什么要用建造者模式(优点)? 1.3 哪些情况不要用建造者模式...

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 一、设计模式(构建模式)——03建造模式与原型模式

    建造者模式 建造型模式用于创建过程稳定,但配置多变的对象。 建造模式的实现要点: 在建造者模式中,指挥者是直接与客...

  • 创建型模式:建造者模式

    个人公众号原文:创建型模式:建造者模式 五大创建型模式之四:建造者模式。 简介 姓名 :建造者模式 英文名 :Bu...

网友评论

      本文标题:建造者模式

      本文链接:https://www.haomeiwen.com/subject/ulzzrktx.html