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

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

相关推荐
lxyzcm几秒前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm1013433 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13141 小时前
常用的缓存技术都有哪些
java
AiFlutter1 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
J不A秃V头A2 小时前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
DARLING Zero two♡2 小时前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
小池先生2 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb2 小时前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
程序员厉飞雨2 小时前
Android R8 耗时优化
android·java·前端