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

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

相关推荐
跟着珅聪学java41 分钟前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
我命由我123451 小时前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
lilye661 小时前
程序化广告行业(55/89):DMP与DSP对接及数据统计原理剖析
java·服务器·前端
战族狼魂4 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
xyliiiiiL5 小时前
ZGC初步了解
java·jvm·算法
杉之6 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch6 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
天天向上杰7 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal
请来次降维打击!!!8 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
用键盘当武器的秋刀鱼8 小时前
springBoot统一响应类型3.5.1版本
java·spring boot·后端