java设计模式实战,建造者模式之生产线(代码片段)

二当家的白帽子 二当家的白帽子     2023-01-07     210

关键词:

  • 非常感谢你阅读本文,欢迎【👍点赞】【⭐收藏】【📝评论】~
  • 放弃不难,但坚持一定很酷!希望我们大家都能每天进步一点点!🎉
  • 本文由 二当家的白帽子 https://le-yi.blog.csdn.net/ 博客原创,转载请注明来源,谢谢~


什么是建造者模式

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

实用范围:

  1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  2. 当构造过程必须允许被构造的对象有不同表示时。

设计模式和编程语言无关,但是二当家的依然用Java语言去实战举例。


建造者模式中的角色

  1. Builder:为创建一个产品对象的各个部件指定抽象接口。
  2. ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  3. Director:构造一个使用Builder接口的对象。
  4. Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

产品角色(Product)

我们用汽车作为产品角色(Product)。我们这里的车包含车身,引擎和动力源(真实的车当然不仅包含这些零件),车身必须有,没有车身根本不能称之为车。

package com.secondgod.builder;

import java.text.MessageFormat;

/**
 * 汽车
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class Car 
    /**
     * 车身(必须有)
     */
    private final String body;
    /**
     * 引擎
     */
    private       String engine;
    /**
     * 动力源
     */
    private       String energy;

    public Car(String body) 
        this.body = body;
    

    public String getBody() 
        return body;
    

    public String getEngine() 
        return engine;
    

    public void setEngine(String engine) 
        this.engine = engine;
    

    public String getEnergy() 
        return energy;
    

    public void setEnergy(String energy) 
        this.energy = energy;
    

    public String toString() 
        return MessageFormat.format("在[0]车身上配备有[1]引擎和[2]动力源的汽车", body, engine, energy);
    


抽象建造者(Builder)

我们用汽车生产线接口作为抽象建造者角色(Builder)。声明出汽车生产线应该有的方法。这里我们仅仅包含建造车身,建造引擎,建造动力源的方法,对应车的配件,还有一个取车的方法用来将造好的车从生产线上取下来。

package com.secondgod.builder;

/**
 * 汽车生产线
 * 
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public interface ICarBuilder 
    /**
     * 建造车身
     */
    void buildBody();

    /**
     * 建造引擎
     */
    void buildEngine();

    /**
     * 建造动力源
     */
    void buildEnergy();

    /**
     * 取车
     * @return
     */
    Car retrieveCar();


具体建造者角色(ConcreteBuilder)

我们用燃油车生产线和电动车生产线作为具体建造者角色(ConcreteBuilder)。这里有一个细节,由于车身是必须有的,所以必须先建造车身。

package com.secondgod.builder;

/**
 * 燃油车生产线
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class GasolineCarBuilder implements ICarBuilder 
    private Car car;

    @Override
    public void buildBody() 
        car = new Car("燃油");
    

    @Override
    public void buildEngine() 
        car.setEngine("燃油发动机");
    

    @Override
    public void buildEnergy() 
        car.setEnergy("汽油油箱");
    

    @Override
    public Car retrieveCar() 
        Car retrieveCar = car;
        car = null;
        return retrieveCar;
    

package com.secondgod.builder;

/**
 * 电动车生产线
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class ElectricCarBuilder implements ICarBuilder
    private Car car;

    @Override
    public void buildBody() 
        car = new Car("电动");
    

    @Override
    public void buildEngine() 
        car.setEngine("电驱动系统");
    

    @Override
    public void buildEnergy() 
        car.setEnergy("新能源电池");
    

    @Override
    public Car retrieveCar() 
        Car retrieveCar = car;
        car = null;
        return retrieveCar;
    

导演者角色(Director)

我们用汽车工程师作为导演者角色(Director)。他知道怎么操作生产线(对不起,我们的生产线不是全自动的)。

package com.secondgod.builder;

/**
 * 汽车工程师
 *
 * @author 二当家的白帽子 https://le-yi.blog.csdn.net/
 */
public class CarEngineer 
    /**
     * 构建汽车
     * 
     * @param builder
     * @return
     */
    public Car constructCar(ICarBuilder builder) 
        builder.buildBody();
        builder.buildEngine();
        builder.buildEnergy();
        return builder.retrieveCar();
    


最终测试

package com.secondgod.builder;

public class Test 

    public static void main(String[] args) 
        // 一个工程师
        CarEngineer carEngineer = new CarEngineer();
        // 两条生产线
        ICarBuilder gasolineCarBuilder = new GasolineCarBuilder();
        ICarBuilder electricCarBuilder = new ElectricCarBuilder();

        // 一天造两辆
        Car gasolineCar = carEngineer.constructCar(gasolineCarBuilder);
        Car electricCar = carEngineer.constructCar(electricCarBuilder);

        // 够生活了
        System.out.println(gasolineCar);
        System.out.println(electricCar);
    

和我们的预期一致,Nice。


尾声

建造者模式经常使用变形,可以把抽象建造者角色,具体建造者和导演者角色合并到一起,比如StringBuilder这个JDK自带的类就是这样。

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

建造者模式 他的本质主要是:分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用建造模式可以将一个产品的内部表象(internalrepresentation)与... 查看详情

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

转自 JAVA设计模式之建造者模式建造者模式(Builder)的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder模式是一步一步创建一个复杂对象的创建型模式,它允许使用... 查看详情

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

...得同样的构建过程可以创建不同的表示,属于创建型设计模式对于用户而言,使用建造者模式只需指定需要创建的类型就可以获得对象,创建过程及细节不需要了解。根据建造者模式的定义,可以简单的理解为两... 查看详情

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

...得同样的构建过程可以创建不同的表示,属于创建型设计模式对于用户而言,使用建造者模式只需指定需要创建的类型就可以获得对象,创建过程及细节不需要了解。根据建造者模式的定义,可以简单的理解为两... 查看详情

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

一、什么是建造者模式:        建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程;通过隔离复杂对象的构建与使用,也就是将产品... 查看详情

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

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

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

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

java设计模式之建造者学习与掌握(代码片段)

...#xff0c;使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每... 查看详情

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

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

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

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

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

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

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

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

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

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

java23种设计模式之四:建造者模式(代码片段)

一.build 介绍二.实现原理  通过访问静态内部的形式得到内部类,内部类通过有参方法将传入的参数赋值给静态内部类对象,外部类私有构造函数,参数设置成静态内部类对象当静态内部类对象通过无参的build方法获得外部... 查看详情

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

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

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

1/**2*作用:3*将复杂物体的构建与表现相分离。4*組成角色:5*1)建造者(Builder):負責定義用來生成實例的接口(API)6*2)具体的建造者(ConcreateBuilder):负责实现Builder角色定义的接口实现类。7*针对不同的业务逻辑,具体化复杂对象的各... 查看详情

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

 建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 组成: 1、builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的... 查看详情

springmvc之requestmappinginfo类建造者模式使用(代码片段)

...o类是存储request与handler对应关系详情的类。该类是典型的建造者模式,下面我们通过源码分析该类为何使用以及如何使用的建造者模式。为何使用建造者模式我们看RequestMappingInfo的成员属性有哪些:privatefinalStringname; privatefinal... 查看详情