java中23种设计模式--构造者模式(Builder)

1 定义

GOF 给建造模式的定义为:将一个复杂对象的构建与它的表示分离,使得一样的构建 过程能够建立不一样的表示。这句话说得很抽象,很差理解,其实它的意思能够理解为:将构 造复杂对象的过程和组成对象的部件解耦。
就像组装的电脑同样,无论什么品牌的配件,只要兼 容就能够装上;一样,同样的配件,能够有好多组装的方式。这是对下降耦合、提升可复用 性精神的一种贯彻。设计模式

2 结构

当要生成的产品有复杂的内部结构——好比由多个对象组成;而系统中对此产品的需求 未来可能要改变产品对象的内部结构的构成,好比说产品的一些属性如今由一个小对象组 成,而更改后的型号可能须要 N 个小对象组成;并且不能将产品的内部构造彻底暴露给客 户程序,一是为了可用性,二是为了安全等因素。知足上面的设计环境就能够考虑使用建造 模式来搭建框架了。安全

建造模式的组成:bash

  1. 抽象构造者模式--这个角色用来规范产品对象的各个组成成分的建造。通常而言,此角色独立于应用程序的业务逻辑。
  2. 具体建造者角色--担任这个角色的是于应用程序紧密相关的类,它们在指导者的调用下 建立产品实例。这个角色在实现抽象建造者角色提供的方法的前提下,达到完成产品组 装,提供成品的功能.
  3. 指导者角色--调用具体建造者角色以建立产品对象。指导者并无产品类的具体知识.(也叫上下文) 真正拥有产品类的具体知识的是具体建造者对象。
  4. 产品角色--建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产 品的接口。

首先客户程序建立一个指导者对象,一个建造者角色,并将建造者角色传入指导者对象 进行配置。而后,指导者按照步骤调用建造者的方法建立产品。最后客户程序从建造者或者 指导者那里获得产品。 从建造模式的工做流程来看,建造模式将产品的组装“外部化”到了建造者角色中来。

3 代码示例

这里以一个简单的iphone6的生产为例
iphone实体类框架

public class Iphone6 {
	
	private Cell cell;	//电池
	private Screen screen;	//屏幕
	private Mainboard mainboard;	//主板
	
	public void open() {
		System.out.println("手机开机");
	}
	
	public Cell getCell() {
		return cell;
	}
	public void setCell(Cell cell) {
		this.cell = cell;
	}
	public Screen getScreen() {
		return screen;
	}
	public void setScreen(Screen screen) {
		this.screen = screen;
	}
	public Mainboard getMainboard() {
		return mainboard;
	}
	public void setMainboard(Mainboard mainboard) {
		this.mainboard = mainboard;
	}

}

//电池类
class Cell{
	private String name;
	public Cell(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

//电池类
class Screen{
	private String name;
	public Screen(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

//主板类
class Mainboard{
	private String name;
	public Mainboard(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
复制代码

指导者接口iphone

//指导者
public interface Iphone6Director {
	Iphone6 dircectIphone6();
}
复制代码

构造者接口ide

//构造者抽象类
public interface Iphone6Builder {
	//构建自组建
	Cell builderCell();
	Screen builderScreen();
	Mainboard builderMainboard();
}
复制代码

构造者实现类--用来建立复杂对象各个组件测试

public class MyIphone6Builder implements Iphone6Builder{

	@Override
	public Cell builderCell() {
		// TODO Auto-generated method stub
		System.out.println("构建屏幕");
		//也能够与工厂模式或单例模式相结合 
		return new Cell("iphone6的屏幕");
	}

	@Override
	public Screen builderScreen() {
		// TODO Auto-generated method stub
		System.out.println("构建电池");
		return new Screen("iphone6的电池");
	}

	@Override
	public Mainboard builderMainboard() {
		// TODO Auto-generated method stub
		System.out.println("构建主板");
		return new Mainboard("iphone6的主板");
	}
	
}
复制代码

指导者实现类--负责安排各个组件的建造顺序ui

public class MyIphone6Director implements Iphone6Director{

	private MyIphone6Builder builder;
	
	public MyIphone6Director(MyIphone6Builder builder) {
		this.builder = builder;
	}
	@Override
	public Iphone6 dircectIphone6() {
		// TODO Auto-generated method stub
		Cell cell = builder.builderCell();
		Mainboard mainboard = builder.builderMainboard();
		Screen screen = builder.builderScreen();
		//装配成iphone6
		Iphone6 iphone6 = new Iphone6();
		iphone6.setCell(cell);
		iphone6.setMainboard(mainboard);
		iphone6.setScreen(screen);
		return iphone6;
	}
}
复制代码

测试类this

public class TestIphone {
	public static void main(String[] args) {
		MyIphone6Director director = new MyIphone6Director(new MyIphone6Builder());
		Iphone6 iphone6 = director.dircectIphone6();
		iphone6.open();
	}
}
复制代码

最终一台iphone手机就被组将建造出来了:
构建屏幕
构建主板
构建电池
手机开机spa

4 构造者模式的优势:

  1. 建造模式使得客户不须要知道太多产品内部的细节。它将复杂对象的组建和表示方式封 装在一个具体的建造角色中,并且由指导者来协调建造者角色来获得具体的产品实例。
  2. 建造模式能够对复杂产品的建立进行更加精细的控制。产品的组成是由指导者角色调用 具体建造者角色来逐步完成的,因此比起其它建立型模式能更好的反映产品的构造过程。

5 扩展:

建造模式中极可能要用到组成成品的各类组件类,对于这些类的建立能够考虑使用工厂 方法或者原型模式来实现,在必要的时候也能够加上单例模式来控制类实例的产生。可是要 坚持一个大前提就是要使引入的模式给你的系统带来好处,而不是臃肿的结构。
建造模式在获得复杂产品的时候可能要引用多个不一样的组件,在这一点上来看,建造模 式和抽象工厂模式是类似的。能够从如下两点来区分二者:建立模式着重于逐步将组件装配 成一个成品并向外提供成品,而抽象工厂模式着重于获得产品族中相关的多个产品对象;抽 象工厂模式的应用是受限于产品族的,建造模式则不会。

还可参考:
Java设计模式之构造者模式,你真正了解过吗

相关文章
相关标签/搜索