上一节说到抽象工厂模式: https://blog.csdn.net/zhanglei082319/article/details/88205107
所谓的抽象工厂模式,就是在同一个工厂中可以生产出同一种类型或者同一系列的多种产品。
今天说说工厂模式中另一种类型:建造者模式
顾名思义,建造者模式是想构建出一个针对于某种或者一些产品的建造者,通过这个建造者来完成这种产品的从开始到结束的全部生产过程,最后得到成品。
比如,前面我们说到苹果手机,华为手机的生产问题以及包装出货问题。我们用到了抽象工厂设计模式,将一种类型手机的整个包装的所有关联操作放置到同一个工厂中进行生产。但是,我们会发现这个里面少了一个非常重要的环节,那就是最后的打包产品并没有。
为了让整个手机的从 “生产” 到 “测试” 再到 “打包封装” 直到返回一个真正的可以发货的产品这样一个完整的过程可以由一个导演来进行执行,那么我们如何来创造这个导演。这里就需要使用到建造这模式。
1、先定义一个手机产品创建者接口
/**
* 手机产品建造者
*/
public interface PhoneBuilder{
/**
* 先创建手机
*/
void buildPhone();
/**
* 创建耳机
*/
void buildHeadSet();
/**
* 创建手机充电器
*/
void buildCharger();
/**
* 创建手机说明书
*/
void buildInstructions();
/**
* 创建手机包装盒
*/
void buildBox();
/**
* 进行测试
*/
void test();
/**
* 最后创建手机成品
*/
PhoneProduct buildProduct();
}
2、创建苹果手机建造者实现类
/**
* 苹果手机产品创建者
*/
public class IPhoneBuilder implements PhoneBuilder {
private IPhone iPhone;
private IPhoneHeadSet iPhoneHeadSet;
private IPhoneCharger iPhoneCharger;
private IPhoneInstructions iPhoneInstructions;
private IPhoneBox iPhoneBox;
@Override
public void buildPhone() {
this.iPhone = new IPhone();
}
@Override
public void buildHeadSet() {
this.iPhoneHeadSet = new IPhoneHeadSet();
}
@Override
public void buildCharger() {
this.iPhoneCharger = new IPhoneCharger();
}
@Override
public void buildInstructions() {
this.iPhoneInstructions = new IPhoneInstructions();
}
@Override
public void buildBox() {
this.iPhoneBox = new IPhoneBox();
}
@Override
public void test(){
System.out.println("测试成功");
}
/**
* 创建最终产品
* @return iphone产品
*/
@Override
public PhoneProduct buildProduct() {
checkProduct();
PhoneProduct product = new IPhoneProduct()
.setPhone(this.iPhone)
.setPhoneHeadSet(iPhoneHeadSet)
.setPhoneCharger(iPhoneCharger)
.setPhoneInstructions(iPhoneInstructions)
.setPhoneBox(iPhoneBox);
test();
this.clear();
return product;
}
/**
* 校验产品零件是否缺少
*/
private void checkProduct(){
if(this.iPhone == null ||
this.iPhoneBox == null ||
this.iPhoneInstructions == null ||
this.iPhoneCharger == null ||
this.iPhoneHeadSet == null){
throw new RuntimeException("无法创建产品,缺少零件!");
}
}
/**
* 创建完成后清除零件
*/
private void clear(){
this.iPhone = null;
this.iPhoneBox = null;
this.iPhoneInstructions = null;
this.iPhoneCharger = null;
this.iPhoneHeadSet = null;
}
}
这样我们在创建一个完整的苹果手机时,只需要将创建者先创建出来,然后由创建者来创建苹果手机产品就可以了!
如下:
public static void main(String[] args) {
//实例化苹果手机创建者
PhoneBuilder builder = new IPhoneBuilder();
builder.buildPhone();
builder.buildBox();
builder.buildCharger();
builder.buildHeadSet();
builder.buildInstructions();
//创建
PhoneProduct product = builder.buildProduct();
System.out.println("创建成功:"+product);
}
注意:这里的建造者并不是线程安全的,所以一个建造者只能被一个线程使用,但是一个线程可以使用多个建造者!
这样创建一个手机产品的过程是不是更加清晰明了,如果想同时创建多个产品,我们可以实例化多个创建者来进行操作。是不是很方便呢!