频道栏目
首页 > 资讯 > 其他综合 > 正文

设计模式模式(四):建造者模式(生成器模式) - 江流石不转 - 博客园

19-09-29        来源:[db:作者]  
收藏   我要投稿

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

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

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

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

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

  来源: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 }

结果:

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

相关TAG标签
上一篇:设计模式 - 七大设计原则(四)- 合成复用原则与设计原则总结 - EamonZzz - 博客园
下一篇:程序结构设计理论(Android) - 树曲 - 博客园
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站