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

建造者模式也叫做生成器模式,在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

  • 建造者模式定义
    Separate the construction of a complex object from its representation so that same construction process can create different representations. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 建造者模式通用类图
    设计模式之建造者模式(Builder Pattern)_第1张图片
  • 建造者模式的四个角色
    • Director(指导者):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
    • Builder(抽象建造者):给出一个抽象结论,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的对象部件的创建。
    • ConcreteBuilder(具体建造者):实现Builder接口,针对不同的业务逻辑,具体化复杂对象的各部分的创建。在构造过程完成后,提供产品的实例。
    • Product(产品类):要创建的复杂对象。
  • 建造者模式通用代码

产品类

public class Product {

	public void doSth() {
		// TODO
	}
}

抽象建造者

public abstract class Builder {

	public abstract void setPart();
	
	public abstract Product buildProduct();
}

具体建造者

public class ConcreteProduct extends Builder {

	private Product product = new Product();

	@Override
	public void setPart() {
		// TODO Auto-generated method stub

	}

	@Override
	public Product buildProduct() {
		// TODO Auto-generated method stub
		return product;
	}
}

导演类

public class Dicector {

	private Builder builder = new ConcreteProduct();

	public Product getAProduct() {

		builder.setPart();
		// 业务逻辑
		return builder.buildProduct();
	}
}
  • 建造者模式实例
    小王想去电脑城买一台电脑,他不想买一体机,而是想买组装机,过程大概是以下的样子。

    • 电脑城老板(Diretor)和小王(Client)进行需求沟通
    • 了解需求后,电脑城老板将小王需要的主机划分为各个部件(Builder)的建造请求(CPU、主板blabla)
    • 指挥装机人员(ConcreteBuilder)去构建组件
    • 将电脑组装起来,变成小成需要的电脑(Product)
  • 建造者模式实例类图
    设计模式之建造者模式(Builder Pattern)_第2张图片

  • 建造者模式实例代码

电脑类

public class Computer {

	// 电脑组件的集合
	private List parts = new ArrayList();

	// 用于将组件组装到电脑里
	public void Add(String part) {
		parts.add(part);
	}

	public void Show() {
		for (int i = 0; i < parts.size(); i++) {
			System.out.println("组件" + parts.get(i) + "装好了");
		}
		System.out.println("电脑组装完成,请验收");

	}
}

抽象建造者

public abstract class Builder {

	// 第一步:装CPU
	// 声明为抽象方法,具体由子类实现
	public abstract void  BuildCPU();

	//第二步:装主板
	//声明为抽象方法,具体由子类实现 
	public abstract void BuildMainboard();

	// 第三步:装硬盘
	// 声明为抽象方法,具体由子类实现
	public abstract void BuildHD();

	// 返回产品的方法:获得组装好的电脑
	public abstract Computer GetComputer();
}

电脑安装人员

public class ConcreteBuilder extends Builder {

	// 创建产品实例
	Computer computer = new Computer();

	// 组装产品
	@Override
	public void BuildCPU() {
		computer.Add("组装CPU");
	}

	@Override
	public void BuildMainboard() {
		computer.Add("组装主板");
	}

	@Override
	public void BuildHD() {
		computer.Add("组装主板");
	}

	// 返回组装成功的电脑
	@Override
	public Computer GetComputer() {
		return computer;
	}
}

老板类

public class Director {

	public void Construct(Builder builder) {

		builder.BuildCPU();
		builder.BuildMainboard();
		builder.BuildHD();
	}
}

应用类

public class Client {

	public static void main(String[] srgs) {

		Director director = new Director();
		Builder builder = new ConcreteBuilder();
		director.Construct(builder);
		Computer computer = builder.GetComputer();
		computer.Show();
	}
}
  • 应用场景

    • 需要生产的产品对象有复杂的内部结构。
    • 需要生产的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
    • 在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
  • 优点

    • 使用建造者模式可以使客户端不必知道产品内部的组成细节。(封装性)
    • 具体的建造者之间是相互独立的,对系统的扩展非常有利。(扩展性)
    • 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生任何影响。
  • 建造者模式与工厂模式的区别

    • 我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
    • 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

参考书籍:设计模式之禅
实例代码放在这里。

你可能感兴趣的:(设计模式)