建造者模式应用场景

建造者模式:

       建造者模式,又称构建者模式,将一部负责对象的构建分为许多小对象的构建,最后在整合构建的模式。

     构建者模式一般用在构建流程或者组成部件固定的场合,将这些部件分开构建成为组件对象,再将这些组件对象整合成为目标对象。

这里引用下别人画的类图:

                        

成员分析:

    Director:控制者类,这是控制整个组合过程,在这个类内部有个Construct()方法,这个方法的作用就是通过调用Builder内部的各个组件的生成方法来完成组装;

    Builder:构建者接口,定义各部件生成的方法;

    ConcreteBuilder:具体构建者类:实现Builder构建者接口,具体定义如何生成各个部件;依赖于Product成品类,其中还有获取成品组装结构的方法GetResult()方法;

    Product:成品类

【关于建造者模式,我觉得理解一句话很重要】:

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

直接进入例子:

场景:玩过英雄联盟的朋友们都知道,当自己电脑配置太差时,游戏运行起来就特别卡顿。这时就可以手动设置降低游戏画质来达到游戏运行流畅的目的。发散思维,如果我们能控制画面某些不必要的元素,让其不渲染,也可以达到画面不卡顿。这样,我们只需要在设置界面里,设置下,画面的清晰度,不要哪些元素。然后点下按钮,告诉程序我就要这样的质感。我们并不知道程序是怎么构建的,我们知道的只是一个方法,关于构建,程序自动就帮我们构建好了。

代码演示:此处例子只是为了让各位更容易理解建造者模式。当然还有很多不足的地方,也有很多不合理的地方。希望各位不要在意这些细枝末节。理解很重要!!!

1、建造者模式包的结构 

2、先看这个包  com.test.element 这里是存放地图元素,地图中有树、道路、防御塔、野怪、等等。这里只列举部分。望各位体谅。代码多了,新手看起来老火。

(1)防御塔类DefenseTower.java。以下实体类皆省略get  set  及构造方法。

public class DefenseTower {
	private int size; //防御塔尺寸
	private int x;  //防御塔x坐标
	private int y; //防御塔y坐标
	private int aggressivity; //防御塔攻击力
	private int defenseValue; //防御塔防御值
}

(2)也怪类:Monster.java

public class Monster {
	private int size; //尺寸
	private int x;  //x坐标
	private int y; //y坐标
	private int aggressivity; //怪兽攻击力
	private int defenseValue;  //怪兽防御值
}

(3)道路类:Road .java

public class Road {
	private int width; //路的尺寸
	private int length; //路的长度
	private int x;  //路的x坐标
	private int y;  //路的y坐标
}

(4)树类:Tree.java

public class Tree {
	private String color;  //树颜色
	private int size;  //树尺寸
	private int x;  //树x坐标
	private int y;  //树y坐标
}

2、com.test.resources 包下的 Resources.java类为模拟用户下载的地图资源

public class Resources {
	//模拟下载了防御塔
	public DefenseTower getDefenseTower(){
		return new DefenseTower(12, 50, 50, 100, 80);
	}
	//模拟下载了道路
	public Road getRoad(){
		return new Road(300, 2000, 50, 50);
	}
	//模拟下载了树
	public Tree getTree(){
		return new Tree("绿色", 5, 20, 100);
	}
	//模拟下载了野怪
	public Monster getMonster(){
		return new Monster(18, 60, 150, 75, 40);
	}
}

3、com.test.build 包下是重点

(1)、构建地图的接口:Build.java  对应于建造者角色中的Builder:构建者接口

public interface Build {
	Build  buildDefenseTower(DefenseTower defenseTower); //构建防御塔
	Build  buildRoad(Road road); //构建道路
	Build  buildTree(Tree tree); //构建树
	Build  buildMonster(Monster monster); //构建怪兽
	Build  buildMusic(String music); //构建背景音乐
	Build  buildPx(String px); //构建清晰度
	Map getMap();  //得到构建的地图
}

(2)、具体实现构建地图接口类:CreateMap.java  对应于建造者角色中的ConcreteBuilder:具体构建者类

public class CreateMap implements Build{
	private Map map = new Map();
	@Override
	public Map getMap() {
		return map;
	}
	@Override
	public CreateMap  buildDefenseTower(DefenseTower defenseTower) {
		map.setDefenseTower(defenseTower);
		return this;
	}
	@Override
	public CreateMap  buildRoad(Road road) {
		map.setRoad(road);
		return this;
	}
	@Override
	public CreateMap buildTree(Tree tree) {
		map.setTree(tree);
		return this;
	}
	@Override
	public CreateMap buildMonster(Monster monster) {
		map.setMonster(monster);
		return this;
	}
	@Override
	public CreateMap buildMusic(String music) {
		map.setMusic(music);
		return this;
	}
	@Override
	public CreateMap buildPx(String px) {
		map.setPx(px);
		return this;
	}
}

(3)、建造者类:Director.java  执行地图的各种元素构建,组装,最后生成地图 

public class Director {
	//创建地图的接口具体实现类
	private Build build = new CreateMap();
	//模拟加载用户下载的地图
	private Resources resources = new Resources();
	//开始构建地图,这里有两个参数用于客户端传参数,px:为清晰度;ishasMusic:为是否加载背景音乐
	public Map createMap(String px,boolean ishasMusic){
		build.buildRoad(resources.getRoad())
			.buildDefenseTower(resources.getDefenseTower())
			.buildTree(resources.getTree())
			.buildMonster(resources.getMonster())
			.buildMusic(ishasMusic==true?"加载音乐":"无音乐")
			.buildPx(px);
		return build.getMap();
	}
}

(4)、地图类:Map.java 地图的组成部分。 对应于建造者角色中的 Product:成品类

public class Map {
	private DefenseTower defenseTower; //防御塔
	private Road road;  //道路
	private Tree tree;  // 树
	private Monster monster;  // 怪物
	private String music;  //音乐
	private String px;  //像素
}

4、com.test.clienter 包 中的 Clienter.java 类为模拟客户端

public class Clienter {
	public static void main(String[] args) {
		//首先拥有一个建造者。 在游戏界面可能就是一个按钮。
		Director director = new Director();
		//我要高品质,并且加音乐的
		Map createMap = director.createMap("100%", true);
		System.out.println(createMap);
		//中品质的画面
		Map createMap1 = director.createMap("80%", true);
		System.out.println(createMap1);
		//电脑太差了,低品质的
		Map createMap2 = director.createMap("50%", false);
		System.out.println(createMap2);
	}
}

代码demo:https://github.com/alwaysInRoad/test-builder-pattern.git

如果觉得对你有帮助,乃是我莫大荣幸。若有不懂的地方,可以给我留言,或者加我qq:1226500260

博主百忙之中抽出时间写博客,实属不易,如有转载,请标明出处哦~~~~

猜你喜欢

转载自blog.csdn.net/weixin_40841731/article/details/84852508