模式导读:
建造者模式(Builder Pattern):使用多个简单的对象一步一步构建成一个复杂的对象。
依稀记得当我还是一名高中生时,好像每天都有各种不同"套餐"让我享用,前一天是英语+数学+物理的各种试卷和作业,后一天就是化学+生物+语文,再往后就是英语+数学+化学+生物....,总之单独每一科都会有让你头痛的各种各样的作业,而这些科目组合起来就是一种"套餐","套餐"的构造完全可以与其表示分离,使得同样的构建过程可以创建不同的表示。(想想还是怀念当初老师们定制的各种"套餐",让我们愉快的度过了高中生活)
参考类图:
- 建造者角色(Builder):定义生成实例所需要的所有方法;
- 具体的建造者角色(ConcretBuilder):实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
- 监工角色(Director):定义使用建造者角色中的方法来生成实例的方法;
代码实现:
1.首先要有一个抽象的建造者类,里面有抽象的建造子产品的方法,同时要对具体产品对象保持引用
1 package com.etc; 2 3 public abstract class Builder { 4 5 public Product product=new Product(); 6 //创建cpu 7 abstract void BuildCPU(); 8 //创建显卡 9 abstract void buildVideoCard(); 10 //定义建造方法返回一个产品对象 11 public Product build(){ 12 return product; 13 } 14 15 }
2.然后要有一个具体的产品类,里面包含各种子产品
1 package com.etc; 2 3 public class Product { 4 //产品的组成成分 5 public String cpu; 6 public String videocard; 7 8 public String getCpu() { 9 return cpu; 10 } 11 public void setCpu(String cpu) { 12 this.cpu = cpu; 13 } 14 public String getVideocard() { 15 return videocard; 16 } 17 public void setVideocard(String videocard) { 18 this.videocard = videocard; 19 } 20 21 22 }
3.然后要有一个具体的建造者类,继承抽象建造者类并实现建造子产品的方法
1 package com.etc; 2 3 public class ConcretBuilder extends Builder { 4 //具体的建造者将产品建造成功 5 @Override 6 void BuildCPU() { 7 product.setCpu("CPU"); 8 } 9 10 @Override 11 void buildVideoCard() { 12 product.setVideocard("VideoCard"); 13 } 14 15 }
4.定义一个指挥者,获取具体建造者对象并且获取子产品并进行子产品的组合
1 package com.etc; 2 3 public class Directer { 4 5 private Builder builder; 6 //指挥者角色获取建造者对象 7 public Directer (Builder builder){ 8 9 this.builder=builder; 10 11 } 12 //设置具体的建造者对象 13 public void setBuilder(Builder builder){ 14 15 this.builder=builder; 16 } 17 //组成产品方法实现 18 public Product Construct(){ 19 20 builder.BuildCPU(); 21 builder.buildVideoCard(); 22 return builder.build(); 23 } 24 }
5.定义一个测试类,获取组合产品的子产品并打印
1 package com.etc; 2 3 public class Client { 4 5 public static void main(String[] args) { 6 7 ConcretBuilder cb=new ConcretBuilder(); 8 //指挥者角色获取具体的建造者角色 9 Directer dc=new Directer(cb); 10 //指挥者角色获取到具体产品 11 System.out.println("需求-cpu:"+dc.build().getCpu()+" "+"需求-显卡:"+dc.build().getVideocard()); 12 13 } 14 15 }
运行效果截图:
建造者模式优缺点:
优点: 1、建造者独立,易扩展。 2、便于控制细节风险。
缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。
适用场景:
1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。