模式结构:
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 6 * 适用性: 7 * 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 8 * 当构造过程必须允许被构造的对象有不同的表示时 9 * 时间:2016年2月12日下午4:33:5910 * 作者:cutter_point11 */12 public abstract class PersonBuilder13 {14 //绘画一个人物需要使用到的工具15 protected String tool1;16 protected String tool2;17 18 public PersonBuilder(String t1, String t2)19 {20 this.tool1 = t1;21 this.tool2 = t2;22 }23 24 //绘画头25 public abstract void buildHead();26 //画身体27 public abstract void buildBody();28 //画左脚右脚29 public abstract void buildArmLeft();30 public abstract void buildArmRight();31 //画左手右手32 public abstract void buildLegLeft();33 public abstract void buildLegRight();34 }
我们的抽象生成器派生出相应的子类,用来构造相应的实际使用类型
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 6 * 适用性: 7 * 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 8 * 当构造过程必须允许被构造的对象有不同的表示时 9 * 时间:2016年2月12日下午4:50:3110 * 作者:cutter_point11 */12 public class PersonThinBuilder extends PersonBuilder13 {14 15 public PersonThinBuilder(String t1, String t2)16 {17 super(t1, t2);18 }19 20 @Override21 public void buildHead()22 {23 System.out.println("画出一个瘦子的头");24 }25 26 @Override27 public void buildBody()28 {29 System.out.println("画出一个瘦子的身体");30 }31 32 @Override33 public void buildArmLeft()34 {35 System.out.println("画出瘦子的左臂");36 }37 38 @Override39 public void buildArmRight()40 {41 System.out.println("画出瘦子的右臂");42 }43 44 @Override45 public void buildLegLeft()46 {47 System.out.println("画出瘦子左腿");48 }49 50 @Override51 public void buildLegRight()52 {53 System.out.println("画出瘦子的右腿");54 }55 56 }
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 6 * 适用性: 7 * 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时 8 * 当构造过程必须允许被构造的对象有不同的表示时 9 * 时间:2016年2月12日下午4:53:4910 * 作者:cutter_point11 */12 public class PersonFatBuilder extends PersonBuilder13 {14 15 public PersonFatBuilder(String t1, String t2)16 {17 super(t1, t2);18 }19 20 @Override21 public void buildHead()22 {23 System.out.println("画出一个胖子的头");24 }25 26 @Override27 public void buildBody()28 {29 System.out.println("画出一个胖子的身体");30 }31 32 @Override33 public void buildArmLeft()34 {35 System.out.println("画出胖子的左臂");36 }37 38 @Override39 public void buildArmRight()40 {41 System.out.println("画出胖子的右臂");42 }43 44 @Override45 public void buildLegLeft()46 {47 System.out.println("画出胖子左腿");48 }49 50 @Override51 public void buildLegRight()52 {53 System.out.println("画出胖子的右腿");54 }55 56 }
我们的生成器交给指挥者来实现创建的动作
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:创建人物的指挥者 6 * 时间:2016年2月12日下午4:55:14 7 * 作者:cutter_point 8 */ 9 public class PersonDirector10 {11 private PersonBuilder pb;12 13 //传递相应的人物创建模型14 public PersonDirector(PersonBuilder pber)15 {16 this.pb = pber;17 }18 19 //创建一个人20 public void createPerson()21 {22 pb.buildHead();23 pb.buildBody();24 pb.buildArmLeft();25 pb.buildArmRight();26 pb.buildLegLeft();27 pb.buildLegRight();28 }29 }
测试案例:
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:客户端程序 6 * 时间:2016年2月12日下午4:57:41 7 * 作者:cutter_point 8 */ 9 public class Test10 {11 //创建相应的人物12 public static void create(PersonBuilder pb)13 {14 //借助参数传过来的模型创建相应的对象15 PersonDirector pd = new PersonDirector(pb);16 pd.createPerson();17 }18 19 public static void main(String []args)20 {21 PersonThinBuilder ptb = new PersonThinBuilder("图像工具", "画笔");22 create(ptb); //创建一个瘦子23 System.out.println("==============================================================");24 PersonFatBuilder pfb = new PersonFatBuilder("图像工具", "画笔");25 create(pfb);26 }27 }
运行结果:
1 画出一个瘦子的头 2 画出一个瘦子的身体 3 画出瘦子的左臂 4 画出瘦子的右臂 5 画出瘦子左腿 6 画出瘦子的右腿 7 ============================================================== 8 画出一个胖子的头 9 画出一个胖子的身体10 画出胖子的左臂11 画出胖子的右臂12 画出胖子左腿13 画出胖子的右腿
原标题:【设计模式】2、生成器模式(建造者模式)
关键词:设计模式