Java build模式

当一个类的参数多的情况下,使用重叠构造器模式客户端代码会很难编写,并且可读性差;使用javabean模式,调用一个无参的构造器,然后调用setter方法来设置每个必要的参数。但是javabean自身有着严重的缺点,因为构造过程被分到几个调用中,在构造javabean可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。另一点不足之处,javabean模式阻止了把类做成不可变的可能,这就需要程序员付出额外的努力来确保他的线程安全; build模式 既能保证像重叠构造器那样的安全,也能实现JavaBean模式那样的可读性。
使用build模式的步骤:
(1)不直接生成想要的对象,而是让客户端利用所有必要的参数调用构造器(或者静态工厂),得到一个build对象。
(2)然后让客户端在build对象上调用类似的setter方法来设置每个相关的可选参数,
(3)最后,客户端调用无参的build方法来生成不可变的对象。这个builder是它构建的静态成员类。

实例:

package com.bh.realTimeMonitor.entity;

/**
    设备实体类 
 *  @author 崔耀强   20150507-20150822
 *  @version 1.1
 * */
import java.util.ArrayList;

public class Equipment  {

	private int id;  //设备id
	private String name;  //设备的名称
	private String location;  //位置信息
	private double coordinateX;  // 坐标x
	private double coordinateY;  // 坐标y
	private EquipmentType equipmentType;  //设备类型
	private String IP;  //IP
	private String port;  //端口号
	private int module;  //属于哪个模块(设备连接和位置区分)
	private int subSysId;  //属于哪个子系统
	private String  health;  //设备健康值
	private int netWorkState;  //网络情况
	private ArrayList<BusinessValue> value;

	public ArrayList<BusinessValue> getValue() {
		return value;
	}

	public void setValue(ArrayList<BusinessValue> value) {
		this.value = value;
	}

	public int getNetWorkState() {
		return netWorkState;
	}

	public void setNetWorkState(int netWorkState) {
		this.netWorkState = netWorkState;
	}

	public String getHealth() {
		return health;
	}

	public void setHealth(String health) {
		this.health = health;
	}

	public int getCoordinateInterfaceID() {
		return module;
	}

	public void setCoordinateInterfaceID(int coordinateInterfaceID) {
		module = coordinateInterfaceID;
	}

	public String getIP() {
		return IP;
	}

	public void setIP(String iP) {
		IP = iP;
	}

	public String getPort() {
		return port;
	}

	public void setPort(String port) {
		this.port = port;
	}

	public EquipmentType getEquipmentType() {
		return equipmentType;
	}

	public void setEquipmentType(EquipmentType equipmentType) {
		this.equipmentType = equipmentType;
	}

	public double getCoordinateX() {
		return coordinateX;
	}

	public void setCoordinateX(double coordinateX) {
		this.coordinateX = coordinateX;
	}

	public double getCoordinateY() {
		return coordinateY;
	}

	public void setCoordinateY(double coordinateY) {
		this.coordinateY = coordinateY;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}

	public Equipment(int id, String location ) {

		this.id = id;
		this.location = location;
	}

	public int getModleID() {
		return subSysId;
	}

	public void setModleID(int modleID) {
		this.subSysId = modleID;
	}

	
	public static class Builder {

		private int id;  //设备id
		private String name;  //shebei的名称
		private String location;  //位置信息
		private double coordinateX;  // 坐标x
		private double coordinateY;  // 坐标y
		private EquipmentType equipmentType;  //设备类型
		private String IP;  //IP
		private String port;  //端口号
		private int module;  //属于哪个模块(设备连接和位置区分)
		private int subSysId;  //属于哪个子系统
		private String  health;  //设备健康值
		private int netWorkState;  //网络情况
		private ArrayList<BusinessValue> value;

		public Builder(int id, String name,EquipmentType equipmentType,String location) {
			super();
			this.id = id;
			this.name = name;
			this.equipmentType = equipmentType;
			this.location = location;
		}
		public Builder coordinate_X(double coordinate_X) {
			this.coordinateX = coordinate_X;
			return this;
		}
		public Builder coordinate_Y(double coordinate_Y) {
			this.coordinateY = coordinate_Y;
			return this;
		}
		public Builder iP(String iP) {
			IP = iP;
			return this;
		}
		public Builder port(String port) {
			this.port = port;
			return this;
		}
		public Builder module(int module) {
			this.module = module;
			return this;
		}
		public Builder subSysId(int subSysId) {
			this.subSysId = subSysId;
			return this;
		}
		public Builder health(String health) {
			this.health = health;
			return this;
		}
		public Builder netWorkState(int netWorkState) {
			this.netWorkState = netWorkState;
			return this;
		}
		public Builder value(ArrayList<BusinessValue> value) {
			this.value = value;
			return this;
		}
		public Equipment build() {
			return new Equipment(this);
		}
	}

	private Equipment(Builder builder) {

		id = builder.id;
		name = builder.name;
		location = builder.location;
		coordinateX = builder.coordinateX;
		coordinateY = builder.coordinateY;
		equipmentType = builder.equipmentType;
		IP = builder.IP;
		port = builder.port;
		module = builder.module;
		subSysId = builder.subSysId;
		health = builder.health;
		netWorkState = builder.netWorkState;
		value = builder.value;
	}


	public Equipment() {
		super();
	}

}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Javabuilder模式是一种创建对象的设计模式,它通过将对象的构建步骤分离出来,使得构建过程更加灵活和可控。 在builder模式中,我们通常会定义一个Builder类,用于构建对象的各个属性,并最终返回一个完整的对象。具体实现方式包括: 1. 定义一个内部静态类Builder,用于构建对象。 2. 在Builder类中定义与目标对象相同的属性,并提供对应的setter方法。 3. 在Builder类中定义一个build()方法,用于将Builder对象转换为目标对象。 4. 在目标对象的构造函数中,接收Builder对象作为参数,并将Builder对象中的属性赋值给目标对象。 通过这种方式,我们可以通过链式调用Builder对象的setter方法灵活地设置对象的属性,并最终创建出完整的对象。 例如,我们可以使用builder模式来构建一个Person对象: ```java public class Person { private String name; private int age; private String gender; private Person(Builder builder) { this.name = builder.name; this.age = builder.age; this.gender = builder.gender; } public static class Builder { private String name; private int age; private String gender; public Builder setName(String name) { this.name = name; return this; } public Builder setAge(int age) { this.age = age; return this; } public Builder setGender(String gender) { this.gender = gender; return this; } public Person build() { return new Person(this); } } } ``` 使用方式如下: ```java Person person = new Person.Builder() .setName("张三") .setAge(23) .setGender("男") .build(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值