建造者模式主要解决问题:
具备若干成员,当其中一个成员发生变化,其它成员也随着发生变化。
这种复杂对象的生成需要使用建造者模式来生成。
建造者设计模式的结构图:
来源: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 @Override32 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 @Override14 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 @Override15 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 @Override10 public void changeHeight(int count) {11 12 this.player.height +=count ;13 }14 15 @Override16 public void changeBlockValue(int count) {17 // TODO Auto-generated method stub18 this.player.blockvalue +=count*2;19 }20 21 @Override22 public void changeSpeedValue(int count) {23 // TODO Auto-generated method stub24 this.player.speedvalue -=count ; 25 }26 27 @Override28 public AbstractPlayer getPlayer() {29 // TODO Auto-generated method stub30 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 stub11 this.player.height += count ; 12 }13 14 @Override15 public void changeBlockValue(int count) {16 // TODO Auto-generated method stub17 this.player.blockvalue +=count/2 ; 18 }19 20 @Override21 public void changeSpeedValue(int count) {22 // TODO Auto-generated method stub23 this.player.speedvalue -=count/2 ;24 }25 26 @Override27 public AbstractPlayer getPlayer() {28 // TODO Auto-generated method stub29 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 @Override10 public void changeHeight(int count) {11 // TODO Auto-generated method stub12 this.player.height += count;13 }14 15 @Override16 public void changeBlockValue(int count) {17 // TODO Auto-generated method stub18 this.player.blockvalue += count / 3;19 }20 21 @Override22 public void changeSpeedValue(int count) {23 // TODO Auto-generated method stub24 this.player.speedvalue -= count / 3;25 }26 27 @Override28 public AbstractPlayer getPlayer() {29 // TODO Auto-generated method stub30 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 }
结果:
学识浅薄,如有不对,恳请指教。
原文链接: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