java-设计模式(创建型)-【建造者模式】
1.BuilderMode
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。[构建与表示分离,同构建不同表示]
比如,一辆汽车由很多部件组成。部件有不同,组装方式也有不同。
与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,
指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。
使用场景:
1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
2、当构造过程必须允许被构造的对象有不同的表示时。
2.图解
2.1 抽象产品和具体产品(抽象地图和晴天,阴天地图)
//抽象地图:有不同的部件 public abstract interface AbstractMap { void weather(); void house(); void tree(); void road(); } //晴天:部件显示的较明亮 class SunMap implements AbstractMap { @Override public void weather() { // TODO Auto-generated method stub System.out.println("天空晴朗"); } @Override public void house() { // TODO Auto-generated method stub System.out.println("房子很光亮"); } @Override public void tree() { // TODO Auto-generated method stub System.out.println("树的颜色是浅绿色"); } @Override public void road() { // TODO Auto-generated method stub System.out.println("路有点干燥"); } } //阴天:部件显示的较阴暗 class CloudyMap implements AbstractMap { @Override public void weather() { // TODO Auto-generated method stub System.out.println("天空阴暗"); } @Override public void house() { // TODO Auto-generated method stub System.out.println("房子暗淡"); } @Override public void tree() { // TODO Auto-generated method stub System.out.println("树的颜色是深绿色"); } @Override public void road() { // TODO Auto-generated method stub System.out.println("路有点潮湿"); } }
2.2抽象建造者和具体建造者(高清建造者,低清建造者)
//抽象建造者:1.构建。2.返回 public abstract class AbstractBuilder { //构建地图 public abstract void buidPart(); //返回地图 public abstract AbstractMap getMap(); } //实现建造者:高画质的地图 class HighBuilder extends AbstractBuilder { private AbstractMap map=null; public HighBuilder(AbstractMap map) { this.map=map; } @Override public void buidPart() { //由天空开始到路面创建。 System.out.println("开始创建高清地图。。。"); map.weather(); map.house(); map.tree(); map.road(); System.out.println("高清地图创建完毕。。。"); } @Override public AbstractMap getMap() { // TODO Auto-generated method stub return map; } } //实现建造者:低画质的地图 class LowBuilder extends AbstractBuilder { private AbstractMap map=null; public LowBuilder(AbstractMap cloudymap) { this.map=cloudymap; } @Override public void buidPart() { //由天空开始到路面创建。 System.out.println("开始创建低画质地图。。。"); map.weather(); map.house(); //cloudymap.tree();低画质看不到树木 map.road(); System.out.println("低画质地图创建完毕。。。"); } @Override public AbstractMap getMap() { // TODO Auto-generated method stub return map; } }
2.3 指导者:返回高清或低清的地图
//指导者:根据要求返回高清或低清的地图 public class Director { private AbstractBuilder highbuilder=null; private AbstractBuilder lowbuilder=null; public AbstractMap getHighMap(AbstractMap map) { //传入一张图给高清建造者 highbuilder=new HighBuilder(map); highbuilder.buidPart(); //建造完毕,返回高清图 return highbuilder.getMap(); } public AbstractMap getLowMap(AbstractMap map) { //传入一张图给低清建造者 lowbuilder=new LowBuilder(map); lowbuilder.buidPart(); //建造完毕,返回低清图 return lowbuilder.getMap(); } }
2.4 测试
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Director director=new Director(); System.out.println("我需要一张高清的晴天地图"); SunMap sunmap= new SunMap(); director.getHighMap(sunmap); System.out.println("我需要一张低画质阴天地图"); CloudyMap cloudymap=new CloudyMap(); director.getLowMap(cloudymap); } }
2.5 运行结果
我需要一张高清的晴天地图 开始创建高清地图。。。 天空晴朗 房子很光亮 树的颜色是浅绿色 路有点干燥 高清地图创建完毕。。。 我需要一张低画质阴天地图 开始创建低画质地图。。。 天空阴暗 房子暗淡 路有点潮湿 低画质地图创建完毕。。。