java设计模式-建造者模式

模式导读:

        建造者模式(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、需要生成的对象内部属性本身相互依赖。

原文地址:https://www.cnblogs.com/weekstart/p/builder.html