设计模式 | 建造者模式及应用

1、建造者模式角色分析:

建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

建造者模式一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

角色Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。

Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

2、建造者模式运用

相信很多小伙伴都玩过吃鸡游戏吧,那么大家了解吃鸡场景的环境是怎么实现的吗?相信许多小伙伴都经历过吃鸡游戏的黑夜模式、白天、阴雨天这些场景。那么我们今天就分析下这些地图环境是如何实现的。

简单的来说,地图会有晴天和阴天、黑夜之分,那么创建地图时就要根据晴天或者阴天来对地图上的场景,比如:天空,树,房子,和路面进行渲染,这个过程是一个固定的,每创建一个新地图都要执行这几个渲染,这是针对高级配置的电脑来说的。

建造者模式-JAVA代码实现

产品角色 Map

/**
 * Created by sww_6 on 2019/4/8.
 * 吃鸡游戏地图-----Product(产品角色))
 */
@Data
public class Map {
  //天气
  private String weather;
  //房子
  private String house;
  //树木
  private String tree;
  //道路
  private String way;

}

  具体建造者 CloudyBuild,SunBuild,分别建造阴天地图和晴天地图

/**
 * Created by sww_6 on 2019/4/8.
 */
public class CloudyBuild extends Build {

  public void buildWeather() {
    map.setWeather("下雨天");
  }

  public void buildHouse() {
  map.setHouse("房子颜色灰暗");
  }

  public void buildTree() {
   map.setTree("树的颜色是深绿色");
  }

  public void buildWay() {
    map.setWay("道路湿滑");
  }
}

  

/**
 * Created by sww_6 on 2019/4/8.
 */
public class SunBuild extends Build {

  public void buildWeather() {
    map.setWeather("艳阳高照的大晴天");
  }

  public void buildHouse() {
   map.setHouse("房子玻璃再反光");
  }

  public void buildTree() {
   map.setTree("输的颜色位浅绿色");
  }

  public void buildWay() {
   map.setWay("路面干燥");
  }
}

  指挥者 MapDirector,指挥构建过程.

/**
 * Created by sww_6 on 2019/4/8.
 * 指挥者 MapDirector,指挥构建过程
 */
public class MapDirector {

  public Map constract(Build build){
    Map map;
    build.buildWeather();
    build.buildHouse();
    build.buildTree();
    build.buildWay();
    map = build.createMap();
    return map;
  }
}

  客户端测试

/**
 * Created by sww_6 on 2019/4/8.
 * 指挥者 MapDirector,指挥构建过程
 */
public class MapDirector {

  public Map constract(Build build){
    Map map;
    build.buildWeather();
    build.buildHouse();
    build.buildTree();
    build.buildWay();
    map = build.createMap();
    return map;
  }
}

  输出:

Map(weather=艳阳高照的大晴天, house=房子玻璃再反光, tree=输的颜色位浅绿色, way=路面干燥)

适用场景

需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

posted @ 2019-04-08 18:30 左手背右手背 阅读(...) 评论(...) 编辑 收藏