(一)Java常用设计模式之——Builder(建造者模式)

建造者模式的目的就是将复杂的对象的构造与表示过程分离,以便相同的构造过程可以创建不同的表示。
单纯这样讲可能比较难懂,直接来看下面的例子。

现在有一个people类,由name, gender, region 三个参数,不同people的这几个的值是不一样的。如果不使用builder模式。那么很可能在创建很多对象的时候代码量很多且冗余,而且假如想要创建一个region都是上海的人们,那么就要在每创建一次对象的时候赋值一次,十分不灵活,但是如果使用builder模式,这些问题就都可以得到解决。

下面是一个builder模式的示例代码:

  1. 首先创建一个People.class
public class People {

	String region;
	String name;
	String gender;
	
	public String getRegion() {
		return region;
	}
	public void setRegion(String region) {
		this.region = region;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return getName() + ", " + getGender() + ", " + getRegion() +"人";
	}
}

  1. 创建一个抽象类,Builder,在这个抽象类中实现几个抽象方法,或者也可以将Builder类定义为接口,被后面的方法重写
public abstract class Builder {

	abstract void buildRegion(String region);
	abstract void buildName(String name);
	abstract void buildGender(String gender);
	abstract People build();
}
  1. 接下来就是创建一个继承自Builder抽象类或者是重写Builder接口的BuilderPeople.class
public class BuilderPeople extends Builder{

	People people = new People();
	
	@Override
	void buildRegion(String region) {
		// TODO Auto-generated method stub
		this.people.setRegion(region);
	}

	@Override
	void buildName(String name) {
		// TODO Auto-generated method stub
		this.people.setName(name);
	}

	@Override
	void buildGender(String gender) {
		// TODO Auto-generated method stub
		this.people.setGender(gender);
	}

	@Override
	People build() {
		// TODO Auto-generated method stub
		return people;
	}

}
  1. 工具都准备好了,接下来一步就是把上面的工具组装起来,创建一个Director类,在这里就可以给前面的变量赋值,也可以等到后面调用Director的时候赋值
public class Director {

	Builder builder;
	
	public Director(Builder builder) {
		// TODO Auto-generated constructor stub
		this.builder = builder;
	}
	
	public void Director(String name, String region, String gender) {
		builder.buildGender(gender);
		builder.buildName(name);
		builder.buildRegion(region);
	}
}
  1. 使用.创建Test.class
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BuilderPeople builder= new BuilderPeople();
		Director director = new Director(builder);
		director.Director("姚明", "上海", "男");
		People people = builder.build();
		
		System.out.println(people.toString());
	}
}

只需要调用Builder.class中的build方法,就可以生成一个People对象。
输出结果:
在这里插入图片描述

这里就可以看出来,想要构建几个BuilderPeople.class对象都只要在这里调用build方法就可以生成, 并且这其中的属性都可以自由添加。

假如现在我们不想构建BuilderPeople对象,假如构建一个更加庞大的群体,比如说上海人,那就是People中的region属性都要赋值为“上海”,前面说过,这是builder模式的便利之处,可以当很多个对象都有同样的属性时,统一赋值

下面创建一个ShangHaiDirector.class,在这个类里对region赋值为“上海”

public class ShangHaiDirector {

Builder builder;
	
	public ShangHaiDirector(Builder builder) {
		// TODO Auto-generated constructor stub
		this.builder = builder;
	}
	
	public void ShangHaiDirector(String name, String gender) {
		builder.buildGender(gender);
		builder.buildName(name);
		builder.buildRegion("上海");
	}
	
}

Test.class调用

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BuilderPeople p = new BuilderPeople();
		Director director = new Director(p);
		director.Director("姚明", "男");
		
		People people = p.build();
		
		System.out.println(people.toString());
//		BuilderPeople p2 = new BuilderPeople().
	}

}

运行结果和上面是一样的,但是这样几避免了当有大量对象需要构造的时候重复赋值的问题。

.
.
.

欢迎交流和指正

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中解析 XML 属性可以使用 DOM(Document Object Model) 或 SAX(Simple API for XML) 两种方式。 使用 DOM,可以通过获取节点的属性列表,然后遍历属性列表获取属性值。示例代码如下: ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("example.xml")); NodeList nodeList = document.getElementsByTagName("person"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String name = element.getAttribute("name"); String age = element.getAttribute("age"); System.out.println("Name: " + name + ", Age: " + age); } } ``` 使用 SAX,可以在解析 XML 文件时通过实现 ContentHandler 接口重写其中的 startElement 方法,获取节点的属性列表和属性值。示例代码如下: ```java class MyHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("person")) { String name = attributes.getValue("name"); String age = attributes.getValue("age"); System.out.println("Name: " + name + ", Age: " + age); } } } SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(new File("example.xml"), new MyHandler()); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值