一、基本概念
1、创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象。
2、角色
A.建造者角色(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,以规范产品对象的各个组成部分的建造。这个接口规定了要实现复杂对象的哪个部分的创建,但并不涉及具体对象不见的创建。
B.具体创建者角色(ConcreateBuilder):实现Builder接口,针对不同的业务逻辑,具体化复杂对象的各个部分的创建。
C.指导者(Director)调用具体建造者来创建复杂对象的各个部分,在指导者中不设计具体产品的信息,只负责保证对象各部分完整创建或者按某种顺序创建。
D.产品(Product):它是包含多个组成部件的复杂对象,有具体建造者来创建其各个部件。
E.客户端(Client):测试者。
3、场景
大家看过《交换空间》这个栏目栏目,在每一期节目中,都将会有两个家庭互换空间进行装修。在这次装修挑战中,栏目组将会提供20000元装修预算,及10000元家电基金,每个家庭都会配备一名优秀的设计师和若干装修技术工人。装修风格存在差异,装修步骤我们一致时。
二、简单例子
A.建造者角色(Builder):
1 package comm.pattern.create.builder; 2 3 /** 4 * 5 * @Title: Builder.java 6 * @Package: comm.pattern.create.builder 7 * @Description: 抽象创建者 8 * @author yangzhancheng 9 * @2020年3月25日:下午4:20:31 10 * 11 */ 12 public interface IBuilder { 13 14 void buildFloor(); 15 16 void buildKitchen(); 17 18 void buildWall(); 19 20 //创建产品(房屋)整体 21 Product getProduct(); 22 }
B.具体创建者角色(ConcreateBuilder):
B-1:
1 package comm.pattern.create.builder; 2 3 /** 4 * 5 * @Title: Product.java 6 * @Package: comm.pattern.create.builder 7 * @Description:设计师A 8 * @author yangzhancheng 9 * @2020年3月25日:下午4:17:26 10 * 11 */ 12 public class BuilderA implements IBuilder{ 13 14 private Product product = new Product("A.奥先生"); 15 16 public void buildFloor(){ 17 product.setFloor("A.罗马式大理石。"); 18 } 19 20 public void buildKitchen(){ 21 product.setKitchen("A.带有吧台的厨房,便于男主小酌一杯。"); 22 } 23 24 public void buildWall(){ 25 product.setWall("A.文艺复兴欧式复古墙面。"); 26 } 27 28 //创建产品(房屋)整体 29 public Product getProduct(){ 30 return product; 31 } 32 }
B-2:
1 package comm.pattern.create.builder; 2 3 /** 4 * 5 * @Title: Product.java 6 * @Package: comm.pattern.create.builder 7 * @Description:设计师B 8 * @author yangzhancheng 9 * @2020年3月25日:下午4:17:26 10 * 11 */ 12 public class BuilderB implements IBuilder{ 13 14 private Product product = new Product("B.妙女士"); 15 16 public void buildFloor(){ 17 product.setFloor("B.日式榻榻米风格。"); 18 } 19 20 public void buildKitchen(){ 21 product.setKitchen("B.开放式小清新田园风格。"); 22 } 23 24 public void buildWall(){ 25 product.setWall("B.淡雅木质构件。"); 26 } 27 28 //创建产品(房屋)整体 29 public Product getProduct(){ 30 return product; 31 } 32 }
C.指导者(Director):
1 package comm.pattern.create.builder; 2 3 /** 4 * 5 * @Title: BuilderDirector.java 6 * @Package: comm.pattern.create.builder 7 * @Description: 指导者 8 * @author yangzhancheng 9 * @2020年3月25日:下午5:00:28 10 * 11 */ 12 public class BuilderDirector { 13 14 private IBuilder builder = null; 15 16 public BuilderDirector(IBuilder builder){ 17 this.builder = builder; 18 } 19 20 public Product build(){ 21 builder.buildFloor(); 22 builder.buildWall(); 23 builder.buildKitchen(); 24 return builder.getProduct(); 25 } 26 27 }
D.产品(Product):
1 package comm.pattern.create.builder; 2 3 /** 4 * 5 * @Title: Product.java 6 * @Package: comm.pattern.create.builder 7 * @Description:产品类型 8 * @author yangzhancheng 9 * @2020年3月25日:下午4:17:26 10 * 11 */ 12 public class Product { 13 14 //用户 15 private String name; 16 17 //地面 18 private String floor; 19 20 //墙面 21 private String wall; 22 23 //厨房 24 private String kitchen; 25 26 27 public Product(String name){ 28 this.name = name; 29 } 30 31 public void setName(String name) { 32 this.name = name; 33 } 34 35 public String getFloor() { 36 return floor; 37 } 38 39 public void setFloor(String floor) { 40 this.floor = floor; 41 } 42 43 public String getWall() { 44 return wall; 45 } 46 47 public void setWall(String wall) { 48 this.wall = wall; 49 } 50 51 public String getKitchen() { 52 return kitchen; 53 } 54 55 public void setKitchen(String kitchen) { 56 this.kitchen = kitchen; 57 } 58 59 //整体展示 60 public void display(){ 61 System.out.println("这间房子的主人是:"+ this.name); 62 System.out.println("地面采用的是:"+ this.floor); 63 System.out.println("墙面设计的是:"+ this.wall); 64 System.out.println("厨房是:"+ this.kitchen); 65 } 66 }
E.客户端(Client):
1 package comm.pattern.create.builder; 2 3 /** 4 * 5 * @Title: Client.java 6 * @Package: comm.pattern.create.builder 7 * @Description: 描述该文件做什么 8 * @author yangzhancheng 9 * @2020年3月25日:下午5:03:13 10 * 11 */ 12 public class Client { 13 14 public static void main(String[] args) { 15 16 //设计师A 17 System.out.println("A.设计师A给奥先生设计的房间:"); 18 BuilderDirector director = new BuilderDirector(new BuilderA()); 19 Product product = director.build(); 20 product.display(); 21 22 //设计师B 23 System.out.println("-------------------------------"); 24 System.out.println("设计师B给妙女士设计的房间:"); 25 director = new BuilderDirector(new BuilderB()); 26 product = director.build(); 27 product.display(); 28 } 29 30 }
运行结果
A.设计师A给奥先生设计的房间: 这间房子的主人是:A.奥先生 地面采用的是:A.罗马式大理石。 墙面设计的是:A.文艺复兴欧式复古墙面。 厨房是:A.带有吧台的厨房,便于男主小酌一杯。 ------------------------------- 设计师B给妙女士设计的房间: 这间房子的主人是:B.妙女士 地面采用的是:B.日式榻榻米风格。 墙面设计的是:B.淡雅木质构件。 厨房是:B.开放式小清新田园风格。
三、总结
暂无,后续补充。