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

一.场景

  • 我们要建造一个复杂的产品,比如手机、电脑、汽车。这个复杂的产品的创建。有这样一个问题需要处理:
    • 装配这些子组件是不是有个步骤问题?
  • 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

二.本质

  • 分离了对象子组件的单独构造(Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用
  • 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就实现了构建算法、装配算法的解耦,实现了更换的复用。

三.举例实现

  • 造一个XX牌飞船,这个飞船有轨道舱、逃逸塔、引擎。那我们应该先造出这些配件,有了这些配件后,再通过组装造出飞船。

代码实现:

    • 飞船和配件类
java 复制代码
package hs.builder;
/**
*	对象   XX牌飞船
*/
public class AirShip {
   private OrbitalModule orbitalModule;//轨道舱
   private EscpeTower escpeTower;//逃逸塔
   private Engine engine;  //引擎	
   /**
    * 可以构建自己的方法
    */
   public void lunch(){
   	System.out.println("发射。。。。。。。");
   }
   public OrbitalModule getOrbitalModule() {
   	return orbitalModule;
   }
   public EscpeTower getEscpeTower() {
   	return escpeTower;
   }
   public Engine getEngine() {
   	return engine;
   }
   public void setOrbitalModule(OrbitalModule orbitalModule) {
   	this.orbitalModule = orbitalModule;
   }
   public void setEscpeTower(EscpeTower escpeTower) {
   	this.escpeTower = escpeTower;
   }
   public void setEngine(Engine engine) {
   	this.engine = engine;
   }	
}

/**
* 飞船的轨道舱 对象
*/
public class OrbitalModule{
   private String name;
   public OrbitalModule() {
   }
   public OrbitalModule(String name) {
   	this.name = name;
   }
   public String getName() {
   	return name;
   }
   public void setName(String name) {
   	this.name = name;
   }	
}

/**
* 飞船的逃逸塔 对象
*/
public class EscpeTower{
   private String name;
   public EscpeTower() {
   }
   public EscpeTower(String name) {
   	this.name = name;
   }
   public String getName() {
   	return name;
   }
   public void setName(String name) {
   	this.name = name;
   }
}

/**
*  飞船的引擎 对象
*/
public class Engine{
   private String name;
   public Engine() {
   }
   public Engine(String name) {
   	this.name = name;
   }
   public String getName() {
   	return name;
   }
   public void setName(String name) {
   	this.name = name;
   }	
}
    • 构建飞船组件接口与实现类
java 复制代码
/**
 * 构建 飞船的组件  接口
 */
public interface AirShipBuilder {
	OrbitalModule builderOrbitalModule(); 
	EscpeTower builderEscpeTower();
	Engine builderEngine();
}
/**
 * 构建 飞船的组件 对象
 */
public class HisAirShipBuilder implements AirShipBuilder {
	@Override
	public OrbitalModule builderOrbitalModule() {
		System.out.println("构建神州牌轨道舱。。。。");
		return new OrbitalModule("神州牌轨道舱");
	}
	@Override
	public EscpeTower builderEscpeTower() {
		System.out.println("构建神州牌逃逸塔。。。。");
		return new EscpeTower("神州牌逃逸塔");
	}
	@Override
	public Engine builderEngine() {
		System.out.println("构建神州牌引擎。。。。");
		return new Engine("神州牌引擎");
	}
}
    • 组装飞船对象接口和实现类
java 复制代码
/**
* 组装  飞船对象 接口
*/
public interface AirShipDirector {
   AirShip directorAirShip();
}
/**
* 组装  飞船对象
*/
public class HisAirShipDirector implements AirShipDirector{
   private  AirShipBuilder builder;
   public HisAirShipDirector(AirShipBuilder builder) {
   	this.builder=builder;
   }
   @Override
   public AirShip directorAirShip() {
   	OrbitalModule o=builder.builderOrbitalModule();
   	EscpeTower e=builder.builderEscpeTower();
   	Engine en=builder.builderEngine();
   	
   	//装配成飞船对象
   	AirShip ship=new AirShip();
   	ship.setOrbitalModule(o);
   	ship.setEscpeTower(e);
   	ship.setEngine(en);
   	return ship;
   }
}
    • 使用者调用
java 复制代码
/**
* 建造者模式
*/
public static void main(String[] args) {
  AirShipDirector director =new HisAirShipDirector(new HisAirShipBuilder());
  AirShip ship= director.directorAirShip();
  //可以调用AirShip里构建的方法(AirShip里可以构建各种指令方法)
  ship.lunch();
  System.out.println(ship.getOrbitalModule().getName());	
}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式持续更新中...

相关推荐
野生技术架构师10 分钟前
牛客网Java 高频面试题总结(2025最新版)
java·开发语言·面试
纪莫19 分钟前
技术面:SpringBoot(springboot的类加载和传统的双亲委派有什么区别、如何按顺序实例化Bean)
java·spring·java面试⑧股
kyle~37 分钟前
CPU调度---协程
java·linux·服务器·数据库·c++20
会飞的小蛮猪41 分钟前
Skywalking运维之路(Skywalking服务搭建)
java·运维·监控
L.EscaRC1 小时前
Redisson在Spring Boot中的高并发应用解析
java·spring boot·后端
他们叫我技术总监1 小时前
从开发者视角深度评测:ModelEngine 与 AI 开发平台的技术博弈
java·人工智能·dubbo·智能体·modelengine
李辉20031 小时前
Python逻辑运算符
java·网络·python
摇滚侠1 小时前
Spring Boot3零基础教程,StreamAPI 介绍,笔记98
java·spring boot·笔记
扫地僧过江南1 小时前
Kanass零基础学习,如何进行任务管理
java·禅道·项目管理工具
无敌最俊朗@1 小时前
C++ 值类别与移动语义详解(精简版)
java·数据结构·算法