定义:
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
理解:
建造者模式有两重含义:
1 将一个对象的使用和创建过程分离,这样用户在使用这个对象的时候,就不需要关心该对象的具体创建过程和细节。
2 将对象创建的步骤抽象出来,再创建其他创建步骤相同的对象时,只需要依赖这个抽象(前提是这个对象的建造顺序是稳定的)
图示:
通过上图可以看出,建造者模式中的角色有4类:
Director:指挥者,与客户端进行沟通,封装对象创建过程
Builder:创建对象各个步骤的抽象
ConcreteBuilder:实现抽象,进行具体的操作
Product:被创建的对象
实例:
这里举一个生产共享单车的例子,我们通过建造者模式,创建膜拜和ofo两种单车。
这里单车就是Product,两种不同种类的单车对应着ConreteBuilder,生产单车的步骤被抽象到了Builder中。 Director负责与客户端进行交互,封装单车的生产过程。
/** * 单车. * * @author jialin.li * @date 2019-12-30 15:37 */ public class Bike { private String tire; private String paint; private String theme; public void setTire(String tire) { this.tire = tire; } public void setPaint(String paint) { this.paint = paint; } public void setTheme(String theme) { this.theme = theme; } @Override public String toString() { return "Bike{" + "tire='" + tire + '\'' + ", paint='" + paint + '\'' + ", theme='" + theme + '\'' + '}'; } }
/** * 建造者,生产单车步骤的抽象(胡乱写的步骤...). * * @author jialin.li * @date 2019-12-30 15:29 */ public interface Builder{ /** 安装轮胎 */ void installTire(); /** 喷漆 */ void sprayPaint(); /** 联网 */ void theme(); /** 获得产品 */ Bike getProduct(); }
/** * 指挥者. * * @author jialin.li * @date 2019-12-30 15:44 */ public class Director { public static Bike builder(Builder builder){ builder.installTire(); builder.sprayPaint(); builder.theme(); return builder.getProduct(); } }
/** * 膜拜单车 * * @author jialin.li * @date 2019-12-30 15:35 */ public class MobikeBuilder implements Builder{ private Bike bike; public MobikeBuilder() { this.bike = new Bike(); } @Override public void installTire() { bike.setTire("山地胎"); } @Override public void sprayPaint() { bike.setPaint("橘色喷漆"); } @Override public void theme() { bike.setTheme("摩拜单车"); } @Override public Bike getProduct() { return bike; } }
/** * ofo单车 * * @author jialin.li * @date 2019-12-30 15:44 */ public class OfoBuilder implements Builder{ private Bike bike; public OfoBuilder() { this.bike = new Bike(); } @Override public void installTire() { bike.setTire("防滑胎"); } @Override public void sprayPaint() { bike.setPaint("黄色喷漆"); } @Override public void theme() { bike.setTheme("OFO"); } @Override public Bike getProduct() { return bike; } }
/** * 客户端. * * @author jialin.li * @date 2019-12-30 15:50 */ public class Main { public static void main(String[] args) { Builder mobikeBuilder = new MobikeBuilder(); Builder ofoBuilder = new OfoBuilder(); Bike mobike = Director.builder(mobikeBuilder); System.out.println(mobike.toString()); Bike ofo = Director.builder(ofoBuilder); System.out.println(ofo.toString()); } }
结果:
Bike{tire='山地胎', paint='橘色喷漆', theme='摩拜单车'} Bike{tire='防滑胎', paint='黄色喷漆', theme='OFO'}
期待您的关注、推荐、收藏,同时也期待您的纠错和批评。