经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式模式(四):建造者模式(生成器模式)
来源:cnblogs  作者:江流石不转  时间:2019/9/26 11:33:51  对本文有异议

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

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

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

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

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

 

 

 例子:

  街头篮球角色创建模拟

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

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

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

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

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

 

代码如下:

  代码结构图;

      

  具体代码;

 

父类;AbstractPlayer: 

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

 CPlayer:前锋entity:

 

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

FPlayer:中锋entity:

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

GPlayer:后卫entity:

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

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

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

CPlayerBuilderImpl:

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

FPlayerBuilderImpl:

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

GPlayerBuilderImpl:

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

Redirector(总指挥)

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

测试:

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

结果:

 

 

 

 

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

原文链接:http://www.cnblogs.com/jiangliushibuzhuan/p/11589284.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号