设计模式之建造者模式

author author     2022-12-05     200

关键词:


1 定义

建造者模式(Builder Patten):将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式用于一步一步创建一个复杂的对象,他允许用户只通过指定复杂对象的类型和内容进行构建,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式,根据翻译的不同,建造者模式又可称为生成器模式。

2 结构与角色

建造者模式包含4个角色

  • Builder:抽象建造者。为创建一个Product对象的各个部件指定的抽象接口。
  • ConcreteBuilder:具体建造者。实现抽象建造者Builder,构建和装配产品的各个部件。做具体建造工作,但却不为客户端所知。
  • Product:产品,被构建的复杂对象。具体建造者创建该产品的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终的产品的接口。
  • Director:指挥者。构建一个使用抽象建造者Builder的对象。它与客户端打交道,将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给ConcreteBuilders。

3 例子

建造楼房的过程中,有专业人员绘制图纸,图纸中讲述干什么工人根据图纸去具体实现要干的事情包工头根据实际情况去处理图纸中方法的执行,调配工人以何种顺序完成图纸上的要求。虽然包工头和图纸对建造高楼很有帮助,但是高楼平地起,却是由工人们一砖一瓦的搭建起来。

以上的这个例子很形象的讲述建造者模式执行过程,其中图纸就对应Builder(提供方法,要干什么),工人就对应ConcreteBuilder(具体去干方法中规定的事情),包工头就对应Director(以何种顺序干,调配工人),高楼就对应Product。

3.1 代码

3.1.1 Builder类

Builder类只提供抽象的方法,类似于图纸,只是告诉你建造高楼你需要做什么。

// 抽象方法,要做什么:建设一个大楼需要做什么
public abstract class Builder
abstract void builderA();
abstract void builderB();
abstract void builderC();
abstract void builderD();
abstract Product getProduct();
3.1.2 Worker类

工人是具体实现Builder提出的需求,比如水泥、钢筋等等。工人类直接产生产品(new

package demo01;

// 知道了要做什么,就得有人来具体实现
public class Worker extends Builder
private Product product;

public Worker()
product = new Product();


@Override
void builderA()
product.setBuildA("打地基");
System.out.println("打地基");


@Override
void builderB()
product.setBuildB("钢筋混凝土");
System.out.println("钢筋混凝土");


@Override
void builderC()
product.setBuildC("盖房子");
System.out.println("盖房子");


@Override
void builderD()
product.setBuildD("油漆、粉刷");
System.out.println("油漆、粉刷");

Product getProduct()

return product;

3.1.3 Product类

当产品的本身的属性一一被满足的时候,产品才会产生。

public class Product 
private String buildA;
private String buildB;
private String buildC;
private String buildD;

public String getBuildA()
return buildA;


public void setBuildA(String buildA)
this.buildA = buildA;


public String getBuildB()
return buildB;


public void setBuildB(String buildB)
this.buildB = buildB;


public String getBuildC()
return buildC;


public void setBuildC(String buildC)
this.buildC = buildC;


public String getBuildD()
return buildD;


public void setBuildD(String buildD)
this.buildD = buildD;


@Override
public String toString()
return "Product" +
"buildA=" + buildA + \\ +
", buildB=" + buildB + \\ +
", buildC=" + buildC + \\ +
", buildD=" + buildD + \\ +
;

3.1.4 Director类

包工头,安排工人怎么去做,比如今天下雨,不打水泥了,去抬钢筋,今天不下雨了,去打地基。

// 指挥的作用是,以什么样的顺序,完成产品的制作
public class Director
public Product getProduct(Builder builder)
builder.builderA();
builder.builderB();
builder.builderC();
builder.builderD();
return builder.getProduct();

3.1.5 Test测试类
public class Test01 
public static void main(String[] args)
Director director = new Director();
Product product = director.getProduct(new Worker());
System.out.println(product.toString());

设计模式之建造者模式_建造者模式

指挥者调整顺序可以得到不同的产品,或者不同的效果(虽然这个没体现出来)

设计模式之建造者模式_建造者_02

4 不使用指挥者的例子

去餐厅吃饭,餐厅里一般有默认的套餐,或者自己(用户)点餐,点餐之后,服务员根据订单负责将食品端上来,然后你大快朵颐,享受美食带来的快感....

在这一场景里,就没有指挥者,指挥权到达了用户的手里。上面3中的场景,指挥权就不能到用户手里,你不能让人家掏钱还得让人家自己建(除非是老板)。

4.1 Builder类

public abstract class Builder 
abstract Builder builderA(String msg);
abstract Builder builderB(String msg);
abstract Builder builderC(String msg);
abstract Builder builderD(String msg);
abstract Product getProduct();

4.2 Worker类

public class Worker extends Builder 
private Product product;

public Worker()
product = new Product();



Builder builderA(String msg)
product.setBuildA(msg);
return this;


Builder builderB(String msg)
product.setBuildB(msg);
return this;


Builder builderC(String msg)
product.setBuildC(msg);
return this;


Builder builderD(String msg)
product.setBuildD(msg);
return this;

Product getProduct()
return product;

4.3 Product类

public class Product 
private String buildA = "炸鸡";
private String buildB = "汉堡";
private String buildC = "可乐";
private String buildD = "大蒜";

public String getBuildA()
return buildA;


public void setBuildA(String buildA)
this.buildA = buildA;


public String getBuildB()
return buildB;


public void setBuildB(String buildB)
this.buildB = buildB;


public String getBuildC()
return buildC;


public void setBuildC(String buildC)
this.buildC = buildC;


public String getBuildD()
return buildD;


public void setBuildD(String buildD)
this.buildD = buildD;


@Override
public String toString()
return "Product" +
"buildA=" + buildA + \\ +
", buildB=" + buildB + \\ +
", buildC=" + buildC + \\ +
", buildD=" + buildD + \\ +
;

4.4 Test类

public class Test 
public static void main(String[] args)
Worker worker = new Worker();
System.out.println(worker.builderA("全家桶")
.getProduct());

上面的代码例子中:Worker就相当于服务员,记录你点了什么菜,并生成账单(Product里的信息),反馈给用户产品。

设计模式之建造者模式_ide_03

5 适用场景

  • 需要生成的产品对象有复杂的内部结构(通常包含多个成员属性)
  • 需要生成的产品对象的属性相互依赖(需要指定顺序)
  • 产品对象的创建过程独立于创建该对象的类
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的类

6 优缺点

6.1 优点

  • 用户不需要知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 很方便的替换具体的建造者或者增加新的具体创建者
  • 符合开闭原则,可以更加精细的控制产品的创建过程

6.2 缺点

  • 适用范围收到限制,需要生成的产品对象具有较多共同点
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化。

设计模式之建造者模式(创建型)(代码片段)

模式定义建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法。所谓建造者模式就是将组件和组件的组件过程分开,然后一步一步建造一个复杂的对象。所以建造者模式又叫生成器模式。建造者... 查看详情

设计模式之建造者模式

相关文章设计模式之设计六大原则设计模式之单例模式的七种写法1.建造者模式简介定义建造者模式(builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简介建造者模式(builder)是创... 查看详情

设计模式之建造者模式(代码片段)

设计模式之建造者模式  建造者模式(BuilderPattern)也叫生成器模式,定义:Separatetheconstructionofcomplexobjectfromitsrepresentationsothatthesameconstructionprocesscancreatedifferentrepresentations.(将一个复杂的对象的构建与它的表示 查看详情

设计模式之建造者模式

...它的表示分离,使同样的构建过程可以创建不同的表示的设计模式;classProduct{private$_parts;publicfunction__construct(){$this->_parts=array();}publicfunctionadd($part){returnarray_push($this->_parts 查看详情

设计模式之:建造者模式builderpattern的实现(代码片段)

建造者模式相较于工厂模式,用于创建复杂的对象;使用的技术:继承、抽象类、多态、配置文件、反射;建造者模式的设计原则:面向抽象类编程,符合依赖倒置原则;通过配置文件生成具体建造者,替代抽象建造者,符合里... 查看详情

设计模式之建造者模式(代码片段)

建造者模式1.简要概述2.模式结构3.实现代码4.优点好处5.缺点弊端6.应用场景7.应用示例1.简要概述建造者模式也可以叫做生成器模式。建造者模式就是说首先封装一个对象的构造过程,然后按照这个过程步骤去构建这个对象实... 查看详情

设计模式之建造者模式(代码片段)

设计模式之建造者模式(三)  今天来学习建造者模式,好像也有人叫生成器,一个意思.  一 概念  建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创... 查看详情

设计模式之九:建造者模式(builder)

建造者模式:将一个复杂对象的建造过程和它的表示分离开来,这样同样的建造过程能够创建不同的表示。Separatetheconstructionofacomplexobjectfromitsrepresentationsothatthesameconstructionprocesscancreatedifferentrepresentations.通俗一点就是假设流程是... 查看详情

《设计模式》之建造者模式(builder)

...,如想学习请找下一家。1、简介  是一种对象构建的设计模式,他可以将复杂的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。  优点:建造代码与表示代码分离,有偶遇建造者隐藏了该... 查看详情

设计模式之建造者模式(代码片段)

本文由老王家组装电脑引出——建造者设计模式,详细介绍建造者模式的基本概念和实现代码,为了便于理解建造者模式,我们会对实际应用中的典型案例进行介绍。最后对比工厂模式和建造者模式之间的区别,让我们在实际使... 查看详情

设计模式之建造者模式(builder)

...的例子了。1.初识建造者模式建造者模式实际上是常用的设计模式。顾名思义,builder的意思是建造者或者建筑工人,谈到建造自然会想到楼房 查看详情

设计模式之建造者模式builder

本质与使用场景publicinterfaceAirShipBuilder{EnginebuilderEngine();OrbitalModulebuilderOrbitalModule();EscapeTowerbuilderEscapeTower();}publicclassSxtAirShipBuilderimplementsAirShipBuilder{//StringBuilder,以后学 查看详情

设计模式之建造者模式

1、建造者模式的本质:    a、分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构造过程复杂的情况下使用。    b... 查看详情

设计模式之建造者模式(代码片段)

设计模式之建造者模式importrandomfromabcimportABCMeta,abstractmethodclassCellPhone:#产品端def__init__(self,screen=None,cpu=None,camera=None,cell=None,name=None):#手机的四个属性:屏幕、处理器、摄像头、电池self.screen=Noneself.cpu=Nonese 查看详情

设计模式之建造者模式

...简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个Builder类会一步一步构造最终的对象。该Builder类是独立于其他对象的。介绍意图:将一个复杂的构建与... 查看详情

java设计模式之建造者模式(builderpattern)

前言这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点。一、建造者介绍?用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现了构建和... 查看详情

java设计模式之建造者模式(builderpattern)

前言这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点。一、建造者介绍?用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现了构建和... 查看详情

设计模式从青铜到王者第八篇:创建型模式之建造者模式(builderpattern)(代码片段)

系列文章目录文章目录系列文章目录前言建一栋房子总共分几步?建造者模式告诉你答案!1.建造者模式简介2.建造者模式结构3.建造者模式代码实例3.1.定义产品类House3.2.定义建造者3.2.1.定义抽象建造者AbstractBuilder3.2.2.定... 查看详情