参考自:https://www.jianshu.com/p/afe090b2e19c

简介:

建造者模式是日常开发中比拟常见的设计模式,它的次要作用就是将复杂事物创立的过程形象进去,该形象的不同实现形式不同,创立出的对象也不同。艰深的讲,创立一个对象个别都会有一个固定的步骤,这个固定的步骤咱们把它形象进去,每个形象步骤都会有不同的实现形式,不同的实现形式创立出的对象也将不同。举个常见的例子,想必大家都晓得坦克大战这种小游戏,抉择不同的模式有不同的地图(默认简略版的,简单版的),咱们抉择简略版,那么构建进去的地图当中可能没有碉堡,地雷等等,抉择简单的版本可能就蕴含了这些货色,咱们能够把这个地图的构建步骤形象进去,依据不同的版本构建不同的内容。

应用场景:

如果一个类有多个构造函数,个别超过4个都算多了,且有些参数是可选的,咱们就应该思考用建造者模式来构建这个类的对象

模式构造:

从上图能够看到,Buider模式中有三个角色:

  1. 要建造的产品Product -- 构建的地图
  2. 形象的Builder -- 构建碉堡,地雷,墙等内容
  3. Builder的具体实现SimpleBuilder、ComplexBuilder -- 对Builder中的构建步骤的实现

经典建造者模式实例:

接下来咱们来看下用代码如何实现上述地图构建的过程:

1.Terrain 地形图类:

public class Terrain {    Wall w; Fort f; Mine m;}class Wall {    int x, y, w, h; public Wall(int x, int y, int w, int h) {        this.x = x; this.y = y; this.w = w; this.h = h; }}class Fort {    int x, y, w, h; public Fort(int x, int y, int w, int h) {        this.x = x; this.y = y; this.w = w; this.h = h; }}class Mine {    int x, y, w, h; public Mine(int x, int y, int w, int h) {        this.x = x; this.y = y; this.w = w; this.h = h; }}

2、TerrainBuilder 形象构建过程

package com.mashibing.Builder;public interface TerrainBuilder {    TerrainBuilder buildWall(); TerrainBuilder buildFort(); TerrainBuilder buildMine(); Terrain build();}

3、ComplexTerrainBuilder 具体构建过程

这个具体的构建过程能够有多个实现,比方游戏能够依据不同的模式构建多个不同的地图(简略版,经典版,简单版。。。)

package com.mashibing.Builder;public class ComplexTerrainBuilder implements TerrainBuilder{    Terrain terrain = new Terrain(); @Override public TerrainBuilder buildWall() {        terrain.w = new Wall(10,10,50,50); return this; }    @Override public TerrainBuilder buildFort() {        terrain.f = new Fort(10,10,50,50); return this; }    @Override public TerrainBuilder buildMine() {        terrain.m = new Mine(10,10,50,50); return this; }    @Override public Terrain build() {        return terrain; }}

4、Main 应用

package com.mashibing.Builder;public class Main {    public static void main(String[] args) {        TerrainBuilder builder = new ComplexTerrainBuilder(); Terrain t = builder.buildFort().buildWall().buildMine().build(); }}

变种建造者模式实例:

1、Person

package com.mashibing.Builder;public class Person {    private int id; private String name; private int age; private double weight; private int score; private Location loc; private Person() {}    public static class PersonBuilder{        Person p = new Person(); public PersonBuilder basicInfo(int id,String name,int age){            p.id = id; p.name = name; p.age = age; return this; }        public PersonBuilder weight(double weight){            p.weight = weight; return this; }        public PersonBuilder score(int score){            p.score = score; return this; }        public PersonBuilder loc(String street,String roomNo){            p.loc = new Location(street, roomNo); return this; }        public Person build(){return p;}    }}class Location{    String street; String roomNo; public Location(String street, String roomNo) {        this.street = street; this.roomNo = roomNo; }}

2、应用

package com.mashibing.Builder;public class Main {    public static void main(String[] args) { Person p = new Person.PersonBuilder().basicInfo(1,"zhangsan",18)                .score(20)                .weight(128.2)                .loc("a","a").build(); }}