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

建造者模式主要解决问题:

  具备若干成员,当其中一个成员发生变化,其它成员也随着发生变化。

  这种复杂对象的生成需要使用建造者模式来生成。

建造者设计模式的结构图:

  来源:http://c.biancheng.net/view/1354.html

例子:

  街头篮球角色创建模拟

街头篮球: 中锋、前锋、后卫

最重要的属性:身高(会影响其他属性)

中锋:身高加1 速度减1 盖帽加2

前锋:身高加2 速度减1 盖帽加1

后卫:身高加3 速度减1 盖帽加1

代码如下:

  代码结构图;

      

  具体代码;

父类;AbstractPlayer: 

1 package org.yys.建造者设计模式.interfaces.impl;
 2
 3 public class AbstractPlayer {
 4         /**
 5          * 身高: height
 6          * 速度: speedvalue
 7          * 盖帽: blockvalue
 8          */
 9
10         protected int height;
11         protected int speedvalue;
12         protected int blockvalue;
13         public int getHeight() {
14             return height;
15         }
16         public void setHeight(int height) {
17             this.height = height;
18         }
19         public int getSpeedvalue() {
20             return speedvalue;
21         }
22         public void setSpeedvalue(int speedvalue) {
23             this.speedvalue = speedvalue;
24         }
25         public int getBlockvalue() {
26             return blockvalue;
27         }
28         public void setBlockvalue(int blockvalue) {
29             this.blockvalue = blockvalue;
30         }
31         @Override
32         public String toString() {
33             return "Player [height=" + height + ", speedvalue=" + speedvalue + ", blockvalue=" + blockvalue + "]";
34         }
35
36
37
38 }

CPlayer:前锋entity:

1 package org.yys.建造者设计模式.entity;
 2
 3 import org.yys.建造者设计模式.interfaces.impl.AbstractPlayer;
 4 public class CPlayer  extends  AbstractPlayer{
 5
 6     public CPlayer() {
 7         super();
 8         this.height=190;
 9         this.speedvalue=25;
10         this.blockvalue=75 ;
11     }
12
13     @Override
14     public String toString() {
15         return "CPlayer [toString()=" + super.toString() + "]";
16     }
17
18
19    }

FPlayer:中锋entity:

1 package org.yys.建造者设计模式.entity;
 2 import org.yys.建造者设计模式.interfaces.impl.AbstractPlayer;
 3
 4 public class FPlayer   extends   AbstractPlayer{
 5
 6     @Override
 7     public String toString() {
 8         return "FPlayer [toString()=" + super.toString() + "]";
 9     }
10
11     public FPlayer() {
12         super();
13         this.height=180 ;
14         this.blockvalue=50 ;
15         this.speedvalue=50 ;
16     }
17  }

GPlayer:后卫entity:

1 package org.yys.建造者设计模式.entity;
 2
 3 import org.yys.建造者设计模式.interfaces.impl.AbstractPlayer;
 4
 5 public class GPlayer  extends  AbstractPlayer {
 6
 7     public GPlayer() {
 8         super();
 9         this.height =   170 ;
10         this.blockvalue = 30 ;
11         this.speedvalue =75  ;
12     }
13
14     @Override
15     public String toString() {
16         return "GPlayer [toString()=" + super.toString() + "]";
17     }
18
19
20
21 }

Builder接口(改变数值的具体方法接口)

1 package org.yys.建造者设计模式.interfaces;
 2
 3 import org.yys.建造者设计模式.interfaces.impl.AbstractPlayer;
 4
 5 public interface Builder {
 6
 7     void  changeHeight(int  count);
 8     void  changeBlockValue(int  count);
 9     void  changeSpeedValue(int  count);
10
11     AbstractPlayer    getPlayer();
12 }

CPlayerBuilderImpl:

1 package org.yys.建造者设计模式.interfaces.impl;
 2
 3 import org.yys.建造者设计模式.entity.CPlayer;
 4 import org.yys.建造者设计模式.interfaces.Builder;
 5
 6 public class CPlayerBuilderImpl  implements  Builder {
 7
 8     private   CPlayer    player =  new CPlayer();
 9     @Override
10     public void changeHeight(int count) {
11
12         this.player.height  +=count ;
13     }
14
15     @Override
16     public void changeBlockValue(int count) {
17         // TODO Auto-generated method stub
18         this.player.blockvalue +=count*2;
19     }
20
21     @Override
22     public void changeSpeedValue(int count) {
23         // TODO Auto-generated method stub
24         this.player.speedvalue -=count ;
25     }
26
27     @Override
28     public AbstractPlayer getPlayer() {
29         // TODO Auto-generated method stub
30         return   this.player;
31     }
32
33 }

FPlayerBuilderImpl:

1 package org.yys.建造者设计模式.interfaces.impl;
 2
 3 import org.yys.建造者设计模式.entity.FPlayer;
 4 import org.yys.建造者设计模式.interfaces.Builder;
 5
 6 public class FPlayerBuilderImpl  implements  Builder {
 7     private   FPlayer   player =  new  FPlayer();
 8     @Override
 9     public void changeHeight(int count) {
10         // TODO Auto-generated method stub
11         this.player.height += count ;
12     }
13
14     @Override
15     public void changeBlockValue(int count) {
16         // TODO Auto-generated method stub
17             this.player.blockvalue +=count/2 ;
18     }
19
20     @Override
21     public void changeSpeedValue(int count) {
22         // TODO Auto-generated method stub
23         this.player.speedvalue  -=count/2 ;
24     }
25
26     @Override
27     public AbstractPlayer getPlayer() {
28         // TODO Auto-generated method stub
29         return this.player;
30     }
31
32 }

GPlayerBuilderImpl:

1 package org.yys.建造者设计模式.interfaces.impl;
 2
 3 import org.yys.建造者设计模式.entity.GPlayer;
 4 import org.yys.建造者设计模式.interfaces.Builder;
 5
 6 public class GPlayerBuilderImpl implements Builder {
 7     private GPlayer player = new GPlayer();
 8
 9     @Override
10     public void changeHeight(int count) {
11         // TODO Auto-generated method stub
12         this.player.height += count;
13     }
14
15     @Override
16     public void changeBlockValue(int count) {
17         // TODO Auto-generated method stub
18         this.player.blockvalue += count / 3;
19     }
20
21     @Override
22     public void changeSpeedValue(int count) {
23         // TODO Auto-generated method stub
24         this.player.speedvalue -= count / 3;
25     }
26
27     @Override
28     public AbstractPlayer getPlayer() {
29         // TODO Auto-generated method stub
30         return this.player;
31     }
32
33 }

Redirector(总指挥)

1 package org.yys.建造者设计模式.interfaces;
 2
 3 import org.yys.建造者设计模式.interfaces.impl.AbstractPlayer;
 4
 5 public class Redirector {
 6
 7     private Builder builder;
 8
 9     public Redirector(Builder builder) {
10         super();
11         this.builder = builder;
12     }
13
14     public AbstractPlayer changeCount(int count) {
15
16         builder.changeHeight(count);
17         builder.changeSpeedValue(count);
18         builder.changeBlockValue(count);
19
20         return builder.getPlayer();
21
22     }
23
24 }

测试:

1 package org.yys.建造者设计模式.Demo;
 2
 3 import org.yys.建造者设计模式.interfaces.Redirector;
 4 import org.yys.建造者设计模式.interfaces.impl.AbstractPlayer;
 5 import org.yys.建造者设计模式.interfaces.impl.CPlayerBuilderImpl;
 6
 7 public class TestDemo {
 8     public static void main(String[] args) {
 9
10         Redirector  redirector   =  new  Redirector(new CPlayerBuilderImpl());
11
12         AbstractPlayer  player =redirector.changeCount(10);
13
14         System.out.println(player);
15
16
17     }
18 }

结果:

学识浅薄,如有不对,恳请指教。

(0)

相关推荐