Java技术_每天掌握一种设计模式(005)_使用场景及简单实例(创建型:建造模式)

Java技术_每天掌握一种设计模式(001)_设计模式概念及分类

Java技术_每天掌握一种设计模式(002)_使用场景及简单实例(创建型:单例模式)

Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)

Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)

Java技术_每天掌握一种设计模式(005)_使用场景及简单实例(创建型:建造模式)

Java技术_每天掌握一种设计模式(006)_使用场景及简单实例(创建型:原型模式)


1.模式描述

将一个复杂对象的构建过程(实例化过程)与他的表示(产品)相分离,使得同样的构建过程可以创建不同的表示。

2.模式作用

可以一定程度上解耦,消费者和对象的构造过程隔离开,对象如何构造与消费者完全无关。

可以一定程度增加扩展性,若增加一个产品实现,只需要实现产品接口,修改工厂创建产品的方法,消费者可以无感知(若消费者不关心具体产品是什么的情况)。

可以一定程度增加代码的封装性。建造者类负责构造产品,指挥者类负责操作建造者类进行构造,分工明确。

等等。//TODO

3.适用场景

要创建一些复杂对象(组成这些对象的内部组件的构造顺序是稳定的,但这些组件可能会面临着复杂的变化)的时候。

消费者不关心对象构造过程的时候。

等等。//TODO

例如:复杂异常的构造、各系统间接口传递的复杂对象、不同内容的邮件提示(邮件视为产品,不同builder构造不同内容的邮件)

4.模式要素

提供一个建造者类的接口。建造者类均要实现这个接口。

提供一个指挥者类该类操作建造者类,按照一定步骤进行产品的构建。

由建造者实现类创建产品类的实例。建造者类应提供一系列方法,对产品对象进行初始化。

5.类图


6.模式实例代码

指挥者:

package com.demoFound.builder.director;

import com.demoFound.builder.builder.IMyExceptionBuilder;

/**
 * 构造模式_指导者类
 * 
 * @author popkidorc
 * 
 */
public class MyExceptionDirector {

	// 指挥构造,这里指挥IMyExceptionBuilder创建异常对象
	public void buildException(IMyExceptionBuilder myExceptionBuilder) {
		myExceptionBuilder.addExceptionCode();
		myExceptionBuilder.addExceptionMessageCN();
		myExceptionBuilder.addExceptionMessageUS();
	}
}

建造者:
package com.demoFound.builder.builder;

import com.demoFound.builder.exception.MyAbstractException;

/**
 * 构造模式_构造者接口
 * 
 * @author popkidorc
 * 
 */
public interface IMyExceptionBuilder {

	// 与其他系统集成时,有可能会要求不同语言版本的异常信息。若使用构造模式,添加一种预拌版本消费者完全无察觉,只需要调整builder和director即可

	// 异常编码
	public void addExceptionCode();

	// 异常中文描述
	public void addExceptionMessageCN();

	// 异常英文描述
	public void addExceptionMessageUS();

	public MyAbstractException getResult();
}
package com.demoFound.builder.builder;

import com.demoFound.builder.exception.MyAbstractException;
import com.demoFound.builder.exception.MyExceptionSimple;

/**
 * 构造模式_构造者实现类_检出异常
 * 
 * @author popkidorc
 * 
 */
public class MyExceptionCheckOutBuilder implements IMyExceptionBuilder {

	private MyAbstractException myException;

	public MyExceptionCheckOutBuilder() {
		myException = new MyExceptionSimple();
	}

	@Override
	public void addExceptionCode() {
		myException.setExceptionCode("10002");
	}

	@Override
	public void addExceptionMessageCN() {
		myException.setExceptionMessageCN("实体已被检出,无法操作");
	}

	@Override
	public void addExceptionMessageUS() {
		myException.setExceptionMessageUS("this entity has been checked out");
	}

	@Override
	public MyAbstractException getResult() {
		return myException;
	}

}
package com.demoFound.builder.builder;

import com.demoFound.builder.exception.MyAbstractException;
import com.demoFound.builder.exception.MyExceptionSimple;

/**
 * 构造模式_构造者实现类_找不到实体异常
 * 
 * @author popkidorc
 * 
 */
public class MyExceptionFindEntityBuilder implements IMyExceptionBuilder {

	private MyAbstractException myException;

	public MyExceptionFindEntityBuilder() {
		myException = new MyExceptionSimple();
	}

	@Override
	public void addExceptionCode() {
		myException.setExceptionCode("10001");
	}

	@Override
	public void addExceptionMessageCN() {
		myException.setExceptionMessageCN("实体无法找到");
	}

	@Override
	public void addExceptionMessageUS() {
		myException.setExceptionMessageUS("can not find the entity");
	}

	@Override
	public MyAbstractException getResult() {
		return myException;
	}

}

消费者:

package com.demoFound.builder;

import java.util.HashMap;
import java.util.Map;

import com.demoFound.builder.builder.IMyExceptionBuilder;
import com.demoFound.builder.builder.MyExceptionCheckOutBuilder;
import com.demoFound.builder.builder.MyExceptionFindEntityBuilder;
import com.demoFound.builder.director.MyExceptionDirector;
import com.demoFound.builder.exception.MyAbstractException;

/**
 * 构造模式_消费者类
 * 
 * @author popkidorc
 * 
 */
public class MyBuilderMain {
	// 指挥者初始化,可以考虑用单例
	private static MyExceptionDirector myExceptionDirector = new MyExceptionDirector();

	private static void findEntity(String id) throws MyAbstractException {
		// 模拟的数据集,根据传入id来查询对应数据,map中value值为数据的状态
		Map<String, String> myMap = new HashMap<String, String>() {
			{
				put("ID000001", "checkIn");
				put("ID000002", "checkOut");
			}
		};
		// 如果数据集中没有该数据,抛出找不到实体的异常
		if (!myMap.keySet().contains(id)) {
			// 找一个builder,然后给director,director指挥builder进行产品的生产,消费者完全不关心如何生产,只关心结果
			IMyExceptionBuilder myExceptionBuilder = new MyExceptionFindEntityBuilder();
			myExceptionDirector.buildException(myExceptionBuilder);
			throw myExceptionBuilder.getResult();
		}
		// 如果数据集中有该数据,但该数据是checkout状态,抛出checkout的异常
		if ("checkOut".equals(myMap.get(id))) {
			IMyExceptionBuilder myExceptionBuilder = new MyExceptionCheckOutBuilder();
			myExceptionDirector.buildException(myExceptionBuilder);
			throw myExceptionBuilder.getResult();
		}
		System.out.println("success");
	}

	public static void main(String[] args) {
		try {
			findEntity("ID000003");
		} catch (MyAbstractException e) {
			System.out.println(e.getMessage("CN"));
		}
		try {
			findEntity("ID000002");
		} catch (MyAbstractException e) {
			System.out.println(e.getMessage("US"));
		}
	}

}


点击进入ooppookid的博客

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页