java设计模式之建造者模式(Builder)

Builder 模式定义:

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

Builder 模式又叫做生成器模式,Builder 模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们。用户不知道内部的具体构建细节。Builder 模式是非常类似抽象工厂模式,细微的区别大概只有在反复使用中才能体会到。

如果用了建造者模式,那么用户就只需要指定需要建造的类型,就能够得到他们,具体的建造过程和细节就不需要知道了。



建造者模式的结构图

建造者模式主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的额,但是对象内部的构建通常面临着复杂的变化。

建造者的好处就是使建造代码和表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如果需要改变一个产品的内部表示,只需要重新定义一个具体的建造者。


Product类——产品类,由多个部件组成

public class Product {

	List<String> parts = new ArrayList<>();
	public void add(String part){
		parts.add(part);
	};
	public void show(){
		for (String string : parts) {
			System.out.println(string);
		}
	}
}

Builer类——抽象建造者类,确定产品由两个部件组成。

public abstract class Builder {

	public abstract void BuildPartA();
	public abstract void BuildPartB();
	public abstract Product getProduct();
}

ConcreteBuilder类——指挥者类

public class ConcreteBuilder {

	private Builder builder;
	
	public ConcreteBuilder(Builder builder) {
		this.builder = builder;
	}
	
	public void Construct(){		
		this.builder.BuildPartA();
		this.builder.BuildPartB();
	}
}

ConcreteBuilder1类——具体建造者类

public class ConcreteBuilder1 extends Builder {
	
	private Product product = new Product();
	
	public void BuildPartA() {
		product.add("部件A");	
	};
	public void BuildPartB() {
		product.add("部件B");	
	};

	public Product getProduct() {
		return product;
	}
}

ConcreteBuilder2类——具体建造者类

public class ConcreteBuilder2 extends Builder {
	
	private Product product = new Product();
	
	public void BuildPartA() {
		product.add("部件X");	
	};
	public void BuildPartB() {
		product.add("部件Y");	
	};

	public Product getProduct() {
		return product;
	}
}

客户端代码

public class Client {

	public static void main(String[] args) {
		
		Builder builder1 = new ConcreteBuilder1();
		Builder builder2 = new ConcreteBuilder2();
		
		ConcreteBuilder con1 = new ConcreteBuilder(builder1);
		ConcreteBuilder con2 = new ConcreteBuilder(builder2);
		
		con1.Construct();
		con2.Construct();
		
		Product p1 = builder1.getProduct();
		Product p2 = builder2.getProduct();
		
		p1.show();
		System.out.println("-------------------------------------------");
		p2.show();
		
	}
}

如果需要扩展,只需要增加具体建造者类,让他们继承抽象建造者类,然后客户端就可以调用。



建造者模式实在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时使用的模式。


猜你喜欢

转载自blog.csdn.net/s505592562/article/details/80923104