java23种设计模式之建造者模式

上一节说到抽象工厂模式: 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);
}

    注意:这里的建造者并不是线程安全的,所以一个建造者只能被一个线程使用,但是一个线程可以使用多个建造者!   

这样创建一个手机产品的过程是不是更加清晰明了,如果想同时创建多个产品,我们可以实例化多个创建者来进行操作。是不是很方便呢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值