设计模式2生成器模式(建造者模式)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式2生成器模式(建造者模式)相关的知识,希望对你有一定的参考价值。

模式结构:

技术分享

 

 1 package com.shejimoshi.create.Builder;
 2 
 3 
 4 /**
 5  * 功能:意图是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
 6  *         适用性:
 7  *             当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时
 8  *             当构造过程必须允许被构造的对象有不同的表示时
 9  * 时间:2016年2月12日下午4:33:59
10  * 作者:cutter_point
11  */
12 public abstract class PersonBuilder
13 {
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:31
10  * 作者:cutter_point
11  */
12 public class PersonThinBuilder extends PersonBuilder
13 {
14 
15     public PersonThinBuilder(String t1, String t2)
16     {
17         super(t1, t2);
18     }
19 
20     @Override
21     public void buildHead()
22     {
23         System.out.println("画出一个瘦子的头");
24     }
25 
26     @Override
27     public void buildBody()
28     {
29         System.out.println("画出一个瘦子的身体");
30     }
31 
32     @Override
33     public void buildArmLeft()
34     {
35         System.out.println("画出瘦子的左臂");
36     }
37 
38     @Override
39     public void buildArmRight()
40     {
41         System.out.println("画出瘦子的右臂");
42     }
43 
44     @Override
45     public void buildLegLeft()
46     {
47         System.out.println("画出瘦子左腿");
48     }
49 
50     @Override
51     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:49
10  * 作者:cutter_point
11  */
12 public class PersonFatBuilder extends PersonBuilder
13 {
14 
15     public PersonFatBuilder(String t1, String t2)
16     {
17         super(t1, t2);
18     }
19 
20     @Override
21     public void buildHead()
22     {
23         System.out.println("画出一个胖子的头");
24     }
25 
26     @Override
27     public void buildBody()
28     {
29         System.out.println("画出一个胖子的身体");
30     }
31 
32     @Override
33     public void buildArmLeft()
34     {
35         System.out.println("画出胖子的左臂");
36     }
37 
38     @Override
39     public void buildArmRight()
40     {
41         System.out.println("画出胖子的右臂");
42     }
43 
44     @Override
45     public void buildLegLeft()
46     {
47         System.out.println("画出胖子左腿");
48     }
49 
50     @Override
51     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 PersonDirector
10 {
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 Test
10 {
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生成器模式(建造者模式)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式2生成器模式(建造者模式)

建造者模式

创建模式之建造者模式

[设计模式系列] 建造者

设计模式之:建造者模式BuilderPattern的实现

设计模式之建造者模式