Builder 建造者模式

本文介绍了建造者模式的基本概念、使用场景及其结构,并通过两个实例详细展示了如何应用该模式解决复杂对象构建的问题。

参考自: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();
 }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值