首页 > 其他分享 >建造者模式

建造者模式

时间:2024-09-27 12:49:35浏览次数:3  
标签:return String 创建 建造 模式 part1 public

简介

建造者模式(Builder Pattern)将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示,属于创建型设计模式。

通用模板

  1. 创建产品类:要创建的产品类对象。

    
    // 产品类
    public class Product {
        // 产品组成部件1
        public String part1;
        // 产品组成部件2
        public String part2;
    
        @Override
        public String toString() {
            return "Product{" +
                    "part1='" + part1 + '\'' +
                    ", part2='" + part2 + '\'' +
                    '}';
        }
    }
    
  2. 创建建造者接口:建造者的抽象类,规范产品对象的各个组成部分的创建,一般由子类实现具体的创建过程。

    // 构造者接口
    public interface IBuilder {
        // 返回构建好的产品
        Product build();
    }
    
  3. 创造具体建造者类:具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。

    
    // 具体建造者类
    public  class Builder implements IBuilder{
        // 要建造的产品
        private Product product = new Product();
        // 组合产品的部件1
        public Builder withPart1(String part1){
            product.part1 = part1;
            return this;
        }
        // 组合产品的部件2
        public Builder withPart2(String part2){
            product.part2 = part2;
            return this;
        }
        // 建造最终的产品
        public Product build() {
            return product;
        }
    }
    
    

模板测试

  1. 代码
    
    public class Client {
        public static void main(String[] args) {
            Builder builder = new Builder();
            Product product = builder.withPart1("part1").withPart2("part2").build();
            System.out.println(product);
        }
    }
    
  2. 结果
    Product{part1='part1', part2='part2'}
    

应用场景

建造者模式在日常生活中是很常见的。比如我们在买车的时候会有低配、标配和高配,也有可能会增配、减配。这个选择的过程,就是在运用建造者模式。 从定义来看,建造者模式和工厂模式是非常相似的,和工厂模式一样,具备创建与表示分离的特性。建造者模式唯一区别于工厂模式的是针对复杂对象的创建。也就是说,如果创建简单对象,通常都是使用工厂模式进行创建;而如果创建复杂对象,就可以考虑使用建造者模式。 当需要创建的产品具备复杂创建过程时,可以抽取出共性创建过程,然后交由具体实现类自定义创建流程,使得同样的创建行为可以生产出不同的产品,分离了创建与表示,使创建产品的灵活性大大增加。建造者模式主要适用于以下应用场景。
(1)相同的方法,不同的执行顺序,产生不同的结果。
(2)多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
(3)产品类非常复杂,或者产品类中不同的调用顺序产生不同的作用。
(4)初始化一个对象特别复杂,参数多,而且很多参数都具有默认值。

“生搬硬套”实战

场景描述

构建一个汉堡套餐。

代码开发
  1. 创建产品(这里指的是汉堡)类:

    // 汉堡套餐类
    public class Meal {
        public String burger;
        public String drink;
        public boolean fries;
    
    
        // 打印套餐详情
        @Override
        public String toString() {
            return "Meal{" +
                    "burger='" + burger + '\'' +
                    ", drink='" + drink + '\'' +
                    ", fries=" + fries +
                    '}';
        }
    
    }
    
  2. 创建建造者接口:

    // 构造者接口
    public interface IBuilder {
        // 返回构建好的产品
        Meal build();
    }
    
  3. 创造具体建造者(这里指的是汉堡套餐)类:

    
    // 汉堡套餐类
    public  class MealBuilder implements IBuilder{
        private Meal meal = new Meal();
    
        public MealBuilder withBurger(String burger) {
            meal.burger = burger;
            return this;
        }
    
        public MealBuilder withDrink(String drink) {
            meal.drink = drink;
            return this;
        }
    
        public MealBuilder withFries(boolean fries) {
            meal.fries = fries;
            return this;
        }
    
        public Meal build() {
            return meal;
        }
    
    }
    
    

至此,我们就通过“生搬硬套”建造者模式的模板设计出一套建造一个汉堡套餐代码,接下来我们进行测试:

  • 测试代码

public class Client {
    public static void main(String[] args) {
        MealBuilder builder = new MealBuilder();
        Meal meal = builder.withBurger("Big Mac")
                .withDrink("Coke")
                .withFries(true)
                .build();
        System.out.println(meal);

    }
}
  • 结果
Meal{burger='Big Mac', drink='Coke', fries=true}

总结

对于用户而言,使用建造者模式只需指定需要创建的类型就可以获得对象,创建过程及细节不需要了解。根据建造者模式的定义,可以简单地理解为两层含义。
(1)构建与表示分离:构建代表对象创建,表示代表对象行为、方法,也就是将对象的创建与行为进行分离(对应到Java代码,其实就是使用接口规定行为,然后由具体的实现类进行构建)。
(2)创建不同的表示:也就是具备同样的行为,但是却由于构建的行为顺序不同或其他原因可以创建出不同的表示。

标签:return,String,创建,建造,模式,part1,public
From: https://blog.csdn.net/Android_xue/article/details/142590652

相关文章

  • thinkphp6调用微信商户支付-非工厂模式代码开发
    通过前面10多篇的微信支付开发-支付工厂代码开发我们发现,不管是jsapi支付、app支付、h5支付、native支付或是小程序支付,固定参数基本不变,且又是一家开发。个人建议,最实用的代码输出方式还是采用工具集封装最简单、最直接、最实用。一、支付产品流程图二、微信支付工具集代码......
  • 设计模式之迭代器模式
    迭代器模式迭代器模式(IteratorPattern)是一种行为设计模式,它提供了一种顺序访问集合对象中各个元素的方法,而不需要暴露该对象的内部表示。迭代器模式主要用来遍历集合,如列表、树、图等数据结构。目的迭代器模式的主要目的是将集合对象的遍历行为从集合对象中分离出来,使用一个独......
  • 六、设计模式-6.1、单例模式
    6.1、单例模式6.1.1、在Java中实现单例模式有哪些方法?答:在Java中,实现单例模式的常用方法有以下几种:饿汉式单例模式:在类加载时就创建一个实例,并提供一个公共的静态方法获取实例。代码示例:publicclassSingleton{privatestaticSingletoninstance=newSinglet......
  • OJ在线评测系统 后端 判题机模块预开发 架构分析 使用工厂模式搭建
    判题机模块预开发(架构师)(工厂模式)判题机模块是为了把代码交个代码沙箱去处理得到结果返回代码沙箱梳理判题模块和代码沙箱的关系判题模块:调用代码沙箱把代码和输入交给代码沙箱去执行代码沙箱:只负责接受代码和输入返回编译的结果不负责判题这两个模块完全解耦......
  • 重修设计模式-行为型-责任链模式
    重修设计模式-行为型-责任链模式将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。责任链模式(ChainofResponsibilityPattern)也叫职责链模式,通过将请求的处理分配......
  • C++—单例设计模式
    单例设计模式C++中的单例设计模式是一种常用的软件设计模式,其核心目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。以下是对C++单例设计模式的详细解释:一、单例设计模式的定义单例模式(SingletonPattern)是一种创建型设计模式,它确保一个类只有一个实例,......
  • Flink-Yarn模式修改Task Slot的数量
    1.修改Flink配置文件(flink-conf.yaml)Flink中的TaskManager是根据slots来分配任务的,默认情况下,一个TaskManager可以有多个slots。你可以通过调整flink-conf.yaml中的以下配置来控制每个TaskManager的slot数量:taskmanager.numberOfTaskSlots:<number_of_slots......
  • 常用并发设计模式精讲
    1.优雅终止线程的设计模式思考:在一个线程T1中如何优雅的终止线程T2?正确思路:两阶段终止模式1.1两阶段终止(Two-phaseTermination)模式——优雅的终止线程两阶段终止(Two-phaseTermination)模式是一种用于优雅终止线程的设计模式。该模式的基本思想是通过两个阶段来终止......
  • 2024年模式识别与图像分析国际学术会议(PRIA 2024) 2024 International Conference on P
    文章目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus2024年10月18-20日南京三、大会介绍2024年模式识别与图像分析国际学术会......
  • Python设计模式速通
    目录先导对象的事情类的事情方法面对对象程序设计的几个基本要点封装多态继承抽象组合面对对象程序设计的准则开放/封闭原则控制反转原则接口隔离原则单一职责原则替换原则规定三大模式创建型模式结构型模式行为型模式先导我们开始设计模式之前,首先第......