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

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

相关推荐
JH30733 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble4 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟5 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖5 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707536 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_6 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.6 小时前
Day06——权限认证-项目集成
java
瑶山6 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy6 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法