1、简介
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
2、示例
设备更新完成了,每个车间配置了一个工程师,指导使用新设备制作手机工程。
3、角色
建造者(Builder):给出一个抽象接口,以规范产品对象的各个组成成分的建造。具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。
具体建造者(Concrete Builder):这个角色主要完成的任务包括:
- 实现Builder角色提供的接口,一步一步完成创建产品实例的过程。
- 在建造过程完成后,提供产品的实例。
指导者(Director):担任这个角色的类调用具体建造者角色以创建产品对象。指导者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。
产品(Product):产品便是建造中的复杂对象。
4、具体实现
/**
* @Description: 手机制造抽象类
* @Author: vesus
* @CreateDate: 2018/11/23 下午4:45
* @Version: 1.0
*/
public abstract class Builder {
/**
* 组装手机配件
*/
abstract void builderpart();
/**
* 组装手机屏幕
*/
abstract void builderscreen();
/**
* 组装手机壳
*/
abstract void buildkey();
}
/**
* @Description: 具体的手机制造类---工人
* @Author: vesus
* @CreateDate: 2018/11/23 下午4:52
* @Version: 1.0
*/
public class PhoneBuilder extends Builder {
//持有一个产品的引用
Phone phone ;
public PhoneBuilder() {
this.phone = new Phone();
}
void builderpart() {
phone.add("组装元件");
}
void builderscreen() {
phone.add("组装屏幕");
}
void buildkey() {
phone.add("组装手机壳");
}
public Phone getPhone() {
return phone;
}
}
/**
* @Description: 产品--手机
* @Author: vesus
* @CreateDate: 2018/11/23 下午4:38
* @Version: 1.0
*/
public class Phone {
public Object add;
//手机配件组合
private List<String> parts = new ArrayList<String>();
//将手机配件组装到手机
public void add (String part){
parts.add(part);
}
//展示整个组装过程
public void show(){
for (String part : parts) {
System.out.println("已经"+part+"到手机里面!");
}
}
}
/**
* @Description: 指导者-车间工程师
* @Author: vesus
* @CreateDate: 2018/11/23 下午5:03
* @Version: 1.0
*/
public class Director {
//持有工人的引用,指导工程完成制作
Builder builder ;
public Director(Builder builder) {
this.builder = builder;
}
public void product(){
builder.builderpart();
builder.builderscreen();
builder.buildkey();
}
}
/**
* @Description: 客户
* @Author: vesus
* @CreateDate: 2018/11/23 下午5:06
* @Version: 1.0
*/
public class phoneclient {
public static void main(String[] args) {
Builder builder = new PhoneBuilder();
Director director = new Director(builder);
director.product();
//拿到安装好的手机给客户展示
Phone phone = ((PhoneBuilder) builder).getPhone();
phone.show();
}
}