5.建造者模式(Builder Pattern)

1.定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2.注意事项

建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。

建造者模式和工厂方法模式非常相像,以下是它们之间的区别:

建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的讲就是零件的装配,顺序不同产生的对象也不同;而工厂方法模式则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的

 

3.建造者模式的使用场景:

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
  • 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。

4.通用代码:

package _5BuilderPattern;

// 产品类
public class Product {

	public void doSomething1()
	{
		// 独立业务处理
	}
	
	public void doSomething2()
	{
		// 独立业务处理
	}
}
扫描二维码关注公众号,回复: 1309548 查看本文章
package _5BuilderPattern;

// 抽象建造者
public interface Builder {

	// 设置产品的不同部分(以不同的顺序调用产品方法)
	public void setPart(Object obj);
	
	// 建造产品
	public Product buildProduct();
}
package _5BuilderPattern;

import java.util.List;

// 具体建造者
public class ProductBuilder implements Builder {

	private Product product = new Product();
	
	@SuppressWarnings("unchecked")
	@Override
	public void setPart(Object obj) {
		// 这里方法的调用顺序不同,就产生了建造的产品不一样
		// 该顺序可以在导演类(下面会介绍)中通过参数的形式的决定
		List<String> methods = (List<String>)obj;
		for (String methodString : methods)
		{
			if(methodString.equals("doSomething1"))
			{
				product.doSomething1();
			}
			else if(methodString.equals("doSomething2"))
			{
				product.doSomething2();
			}
		}
	}

	@Override
	public Product buildProduct() {
		return product;
	}

}
package _5BuilderPattern;

import java.util.ArrayList;
import java.util.List;

// 导演类
public class Director {
	
	private Builder builder = new ProductBuilder();
	
	// 构建不同的产品
	public Product getProduct()
	{
		List<String> methods = new ArrayList<String>();
		methods.add("doSomething2");
		methods.add("doSomething1");
		builder.setPart(methods);
		return builder.buildProduct();
	}
}

此处使用了导演类,该类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式较庞大时,导演类可以有多个。

5.建造者模式的优点:

  • 封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节
  • 建造者独立,容易扩展
  • 便于控制细节风险

猜你喜欢

转载自wangwengcn.iteye.com/blog/1706211
今日推荐