设计模式(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):装饰器模式

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

相关推荐
FQNmxDG4S6 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全7 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv77 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211238 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
灰子学技术9 小时前
Envoy 使用的设计模式技术文档
设计模式
极客先躯10 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图