前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大牧絮叨设计模式:建造者模式

大牧絮叨设计模式:建造者模式

作者头像
大牧莫邪
发布于 2019-07-23 02:11:48
发布于 2019-07-23 02:11:48
40500
代码可运行
举报
运行总次数:0
代码可运行

1、 建造模式 概述

建造模式(Builder)[GOF95]是一种对象的创造模式。主要责任是在程序中创建较为复杂的对象,企业项目中在运行环境初始化时经常使用的一种创建模式。

1.1、 核心组件

建造模式和工厂模式极为相似,都是将对象的构建过程和对象的业务处理分离开来,让不同的类型分别承担对象的创建和对象的使用的责任。

建造模式在构建对象的过程中,目标对象一般都是较为复杂的多个对象或者组件内聚并添加一定业务逻辑的对象组件,并且内部对象构建过程区分前后顺序,核心组件如下:

  • 抽象建造者(Builder):规范建造者的一个抽象接口,规范产品建造过程中的步骤和规范,该接口独立于业务逻辑之外,是基于功能拓展的一个抽象依赖。
  • 具体建造者(ConcreteBuilder):该类型与具体业务逻辑紧密相关,实现了抽象建造者接口,是具体产品构建过程的执行者。
  • 零件/聚合对象(AggregationProduct):该类型的对象是最终对象中包含的具体组成部分,该组成部分可能是对象,也可能是组件或者业务逻辑。
  • 产品对象(Product):最终的产品对象,该产品对象是具体建造者最终返回的构建结果,也是我们建造者模式最终产生的和业务逻辑紧密结合的对象。

image.png

1.2、 优点缺陷

优点:

复杂对象的创建分步骤执行,开发难度降低,可读性提升

对象的创建过程和业务处理过程解耦合

缺陷:

系统复杂度提升

系统资源消耗增加

2、 Java 实现

2.1、 抽象建造者Builder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.damu.builder;

/**
 * <p>项目文档: 产品 抽象建造者 </p>
 *
 * @author <a href="https://github.com/laomu/laomu.github.io">大牧</a>
 * @version V1.0
 */
public interface Builder<T> {
    /**
     * 第一个构建步骤
     */
    void builderPart1();

    /**
     * 第二个构建步骤
     */
    void builderPart2();

    /**
     * 获取最终产品
     * @return 最终产品
     */
    T retrieveResult();
}

2.2、 内聚组件Aggregation Product

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.damu.product;

/**
 * <p>项目文档: 复杂对象-组成部分1-eg:楼房</p>
 *
 * @author <a href="https://github.com/laomu/laomu.github.io">大牧</a>
 * @version V1.0
 */
public class Part1Component {

    private String information;

    public Part1Component(String information) {
        this.information = information;
    }

    public String getInformation() {
        return information;
    }

    public void setInformation(String information) {
        this.information = information;
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.damu.product;

/**
 * <p>项目文档: 复杂对象-组成部分1-eg:物业</p>
 *
 * @author <a href="https://github.com/laomu/laomu.github.io">大牧</a>
 * @version V1.0
 */
public class Part2Component {

    private String information;

    public Part2Component(String information) {
        this.information = information;
    }

    public String getInformation() {
        return information;
    }

    public void setInformation(String information) {
        this.information = information;
    }
}

2.3、 具体产品Product

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.damu.product;

/**
 * <p>项目文档: 具体产品类-eg:小区</p>
 *
 * @author <a href="https://github.com/laomu/laomu.github.io">大牧</a>
 * @version V1.0
 */
public class Product {
    private String information;
    private Part1Component part1;
    private Part2Component part2;

    public String getInformation() {
        return information;
    }

    public void setInformation(String information) {
        this.information = information;
    }

    public Part1Component getPart1() {
        return part1;
    }

    public void setPart1(Part1Component part1) {
        this.part1 = part1;
    }

    public Part2Component getPart2() {
        return part2;
    }

    public void setPart2(Part2Component part2) {
        this.part2 = part2;
    }
}

2.4、 具体建造者ConcreteBuilder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.damu.builder;

import com.damu.product.Part1Component;
import com.damu.product.Part2Component;
import com.damu.product.Product;

/**
 * <p>项目文档: 具体建造者</p>
 *
 * @author <a href="https://github.com/laomu/laomu.github.io">大牧</a>
 * @version V1.0
 */
public class ConcreteBuilder implements Builder<Product> {

    private Product product;
    @Override
    public void builderPart1() {
        // builder part1
        Part1Component part1 = new Part1Component("国际工厂-盖楼");
        // other business procedure
        // aggregation
        product.setPart1(part1);
    }

    @Override
    public void builderPart2() {
        // builder part2
        Part2Component part2 = new Part2Component("华夏物理-管理");
        // other business procedure
        // aggregation
        product.setPart2(part2);
    }

    @Override
    public Product retrieveResult() {
        // builder product
        product = new Product();
        product.setInformation("清风小区");
        // step1
        this.builderPart1();
        // other business procedure
        // step2
        this.builderPart2();
        return product;
    }
}

2.5、业务消费者Consumer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.damu.main;

import com.damu.builder.Builder;
import com.damu.builder.ConcreteBuilder;
import com.damu.product.Product;

/**
 * <p>项目文档: 消费者</p>
 *
 * @author <a href="https://github.com/laomu/laomu.github.io">大牧</a>
 * @version V1.0
 */
public class Consumer {
    public static void main(String[] args) {
        // 获取建造工厂
        Builder<Product> builder = new ConcreteBuilder();

        // 获取小区对象
        Product product = builder.retrieveResult();

        System.out.println(product);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 执行结果
Product{information='清风小区', part1=Part1Component{information='国际工厂-盖楼'}, part2=Part2Component{information='华夏物理-管理'}}

3、 Python 实现

3.1、 抽象建造者Builder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import abc


class Builder(metaclass=abc.ABCMeta):
    """抽象建造者"""
    def retrieve_result(self):
        """获取产品对象的方法"""
        raise NotImplemented("该方法必须在子类中实现")

3.2、 内聚组件Aggregation Product

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Part1Component:
    """产品部件1"""
    pass


class Part2Component:
    """产品部件2"""
    pass

3.3、 具体产品Product

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import abc

class Product(metaclass=abc.ABCMeta):
    """建造者产品接口"""

    @abc.abstractmethod
    def information(self):
        raise NotImplemented("该方法必须实现.")
        
class ConcreteProduct(Product):
    """具体产品对象"""

    def __init__(self):
        self.part1 = None
        self.part2 = None

    def information(self):
        print("目标对象")

3.4、 具体建造者ConcreteBuilder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ConcreteBuilder(Builder):
    """具体建造类"""

    def __init__(self):
        """初始化"""
        self.product = ConcreteProduct()

    def __build_part1(self):
        # 构建零件对象
        part1_component = Part1Component()
        # 业务受理
        # 聚合
        self.product.part1 = part1_component

    def __build_part2(self):
        # 构建零件对象
        part2_component = Part2Component()
        # 业务受理
        # 聚合
        self.product.part2 = part2_component

    def retrieve_result(self):
        return self.product

3.5、业务消费者Consumer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == "__main__":
    """测试代码"""
    # 创建建造者对象
    builder = ConcreteBuilder()
    # 建造目标对象
    product = builder.retrieve_result()
    print(product)

4、 Go 实现

4.1、 抽象建造者Builder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Builder interface {
  SetName(name string) Builder
  SetArms(arms string) Builder
  Build() *Character
}

4.2、 具体产品Product

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Character struct {
  Name string
  Arms string
}

func (p *Character) SetName(name string) {
  p.Name = name
}

func (p *Character) SetArms(arms string) {
  p.Arms = arms
}

func (p Character) GetName() string {
  return p.Name
}

func (p Character) GetArms() string {
  return p.Arms
}

4.3、 具体建造者ConcreteBuilder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type CharacterBuilder struct {
  character *Character
}

func (p *CharacterBuilder) SetName(name string) Builder {
  if p.character == nil {
    p.character = &Character{}
  }
  p.character.SetName(name)
  return p
}

func (p *CharacterBuilder) SetArms(arms string) Builder {
  if p.character == nil {
    p.character = &Character{}
  }
  p.character.SetArms(arms)
  return p
}

func (p *CharacterBuilder) Build() *Character {
  return p.character
}

4.4、业务消费者Consumer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type Consumer struct {
  builder Builder
}

func (p Director) Create(name string, arms string) *Character {
  return p.builder.SetName(name).SetArms(arms).Build()
}

func main() {
  var builder Builder = &CharacterBuilder {}
  var consumer *Consumer = &Consumer {builder: builder}
  var character *Character = director.Create("loader", "AK47")
  fmt.Println(character.GetName() + "," + character.GetArms())
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go设计模式之建造者模式
func NewBuilder(build Builder) *Director {
暮雨
2018/11/28
5390
【设计模式】-创建型模式-第2章第3讲-【建造者模式】
墨菲定律中提道:任何事都没有表面看起来的那么简单。无论在现实生活中还是在代码世界中,都存在一些复杂的对象,他们由多个部分组成,每个部分各具功能,协同运作。比如手机包含摄像头、CPU、电池等各种零部件。对于大部分用户而言,无须知道部件之间的组装细节,也几乎不会单独使用某个零部件,而是使用一部完整的手机。如果需要详细关注一个产品部件的生产、安装步骤,可以选择建造者模式对其进行设计与描述,将部件和其组装过程分开,分步创建一个复杂的对象。由于组装部件的过程复杂,因此,装配过程被分离到一个称作建造者的对象里,建造者返回给上层一个完整产品,而无需关心该产品的构建细节,这就是建造者模式的核心思想。
跟着飞哥学编程
2022/12/02
2000
​PHP设计模式之建造者模式
建造者模式,也可以叫做生成器模式,builder这个词的原意就包含了建筑者、开发者、创建者的含义。很明显,这个模式又是一个创建型的模式,用来创建对象。那么它的特点是什么呢?从建筑上来说,盖房子不是一下子就马上能把一个房子盖好的,而是通过一砖一瓦搭建出来的。一个房子不仅有砖瓦,还有各种管道,各种电线等等,由它们各个不部分共同组成了一栋房子。可以说,建造者模式就是这样非常形象的由各种部件来组成一个对象(房子)的过程。
硬核项目经理
2019/10/17
5240
Java设计模式(二)----建造者模式
建造者模式 一、概念 1、产品的内部表象 2、对象性质的建造 二、建造模式的结构 三、建造模式分成两个很重要的部分 四、使用场景 五、使用建造模式构建复杂对象 一、概念  建造模式是对象的创建模式。建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。 1、产品的内部表象   
汤高
2018/01/11
1K0
Java设计模式(二)----建造者模式
一天一个设计模式:建造模式
  建造模式是对象的创建模式,建造模式可以将一个产品的内部表象(个人理解,可以称为组件)与产品的生产分割开来,从而可以使一个建造过程生产出来具有不同内部表象的产品对象。
用户1134788
2018/12/05
3510
一天一个设计模式:建造模式
大牧絮叨设计模式:抽象工厂模式
抽象工厂模式(Abstract Factory)[GOF95]是一种对象的创建模式,是在工厂方法模式上的又一次改进,主要应用于多等级产品结构的项目架构中,将产品对象的创建过程和产品对象的使用过程解耦合,使用抽象工厂模式的架构中业务模型从工厂对象中获取到产品对象,只需要关注产品对象的使用即可,而可能添加了较为复杂业务逻辑的创建过程封装在工厂内部,让系统中各个模块的责任更加明确。
大牧莫邪
2019/07/17
3120
大牧絮叨设计模式:工厂方法模式
工厂方法模式是一种创建模式,又被称为虚拟构造子模式(Virtual Constructor)或者多态性工厂模式(Polymoriphoic Factory)。工厂方法模式是目标是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
大牧莫邪
2019/07/16
4140
大牧絮叨设计模式:工厂方法模式
建造者模式【建造者模式设计模式】
指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
高大北
2022/06/14
4760
Java面向对象设计之建造者模式
无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发动机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节。
Abalone
2022/07/14
3420
Java面向对象设计之建造者模式
大牧絮叨设计模式:简单工厂模式
简单工厂模式是一种创建模式,又称为静态工厂方法模式,但是需要注意的是它不属于GOF23种设计模式之一。
大牧莫邪
2019/07/15
4240
大牧絮叨设计模式:简单工厂模式
设计模式之建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它可以将一个复杂对象的构建过程分解为多个步骤,使得同一个构建过程可以创建不同类型的对象。建造者模式的主要优缺点如下:
孟斯特
2024/01/22
1310
设计模式之建造者模式
小谈设计模式(14)—建造者模式
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
学编程的小程
2023/10/11
1580
小谈设计模式(14)—建造者模式
设计模式:建造者模式
建造者模式是一种创建型设计模式,它主要用来建造复杂的对象。建造者模式的使用目的是将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。这种模式通常包括一个Director类,一个Builder类和多个ConcreteBuilder类。其中Director类负责调用Builder类中的方法来构建对象,而Builder类则负责具体构建对象的过程。
运维开发王义杰
2023/08/10
1470
设计模式:建造者模式
23种设计模式之建造者模式
建造者模式又叫做生成器模式,是23种设计模式中的一种创建型模式。建造者模式,顾名思义,就是为创建对象而生的模式。
VV木公子
2018/08/13
7K0
23种设计模式之建造者模式
建造者模式
建造者模式 应用场景 需要生成的对象具有复杂的内部结构 需要生成的对象内部属性本身相互依赖 与不可变对象配合使用 优点 建造者独立,易拓展 便于控制细节风险 建造者模式 public class BuilderTest { public static void main(String[] args) { ProductBuilder productBuilder = new SpecialConcreteProductBuilder(); Director
许喜朝
2022/05/05
3360
Go 设计模式-建造者模式
工厂模式用来创建不同、但是类型相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定哪种类型的对象,建造者模式是用来构建一种复杂对象,可以通过设置不同的可选参数,定制化创建不同的对象,
王小明_HIT
2021/07/27
3480
设计模式5之建造者模式
一个复杂的对象往往由多个子部件按一定的步骤组成。例如,汽车由发动机、轮胎、方向盘等部件组成的。
Lvshen
2022/05/05
1650
设计模式5之建造者模式
lombok中的builder注解居然是一种设计模式:让我们了解一下实用的“建造者模式”吧
lombok中的builder注解本质上是为你生成了一个构造器Builder类,通过这个类我们可以构造出带此注解的对象。本质上它实现了设计模式中一种经典的模式:建造者模式
程序员黄小斜
2021/12/10
9060
常见的23种设计模式和七大设计模式原则,一篇文章就搞定了!
在软件开发中,设计模式是一种经过验证的解决方案,它可以帮助开发人员更好地组织和编写代码。设计模式不仅可以提高代码的可读性和可维护性,还可以加速软件开发的进程。
网络技术联盟站
2023/06/03
2.8K0
建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它通过将对象的构造与表示分离,使得同样的构建过程可以创建不同的对象。
码事漫谈
2024/12/20
1060
建造者模式
推荐阅读
相关推荐
go设计模式之建造者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验