也叫做生成器模式,其定义如下:讲一个复杂的对象构建与他的表示分离,使得同样的创建过程可以创建不同的表示。
在建造者模式中,有四个角色:
- Product产品模型类
通常是实现了模板方法,也就是有模板方法和基本方法。
- Builder抽象建造类
产品的组建,一般由子类实现。
- ConcreateBuilder具体建造者
实现抽象类的具体方法,并且返回一个组建好的对象。
- Director导演类
设计产品的构建方式,告知builder开始构建。
以下是一段通用代码示例:
//产品类public class Product{ public void doSomething(){ }}//抽象建造类public abstract class Builder{ //设置产品的不同部分,以获得不同的产品 public abstract void setPart(); //建造产品 public abstract Product buildProduct();}//具体建造者public class ConcreateProduct extends Builder{ private Product product = new Product(); //设置产品零件 public void setPart(){ /**产品类的逻辑处理*/ } //组建一个产品 public Product buildProduct(){ return product; }}//导演类,可以起到封装作用,防止高层模块侵入到建造者内部的实现类中public class Director{ private Builder builder = new ConcreateProduct(); //构建不同的产品 public Product getAProduct(){ builder.setPart(); return builder.buildProduct(); }}
建造者模式优点:
- 封装性,使客户端不必知道产品内部组成的细节。
- 建造者独立,容易扩展。如果有多个ConcreateProduct是相互独立的,对系统扩展非常有利。
- 便于控制细节风险,由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生影响。
使用场景:
- 相同的执行方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,可以使用该模式
- 产品类非常复杂,或者产品类中的调用顺序产生不同的效能,适合使用该模式
扩展之链式编程:
建造者模式与工厂模式区别在于使用不同的顺序构造不同的对象,下面举一个例子(转载自博文https://blog.csdn.net/minwenping/article/details/78725911?utm_source=copy
),假设有四个角色:
1.用户client,提出造房子 Room的需求
2.设计者,Designer,出图纸,指挥包工头干,持有包工头
3.包工头, interface Build,拥有步骤和返回房子Room
4.Room,最终的产品
代码如下:
public class Room { //产品类,room,返回给client private String window; private String floor; /** * 真正的构建过程 * @param roomParams * @return */ public Room freshRoom(RoomParams roomParams) { this.window=roomParams.window; this.floor=roomParams.floor; return this; } @Override public String toString() { return "Room [window=" + window + ", floor=" + floor + "]"; }}
public class WorkerBuilder { //具体建造者 工人worker持有房子引用 Room room=new Room(); RoomParams roomParams=new RoomParams(); public WorkerBuilder makeWindow(String windowStyle) { roomParams.setWindow(windowStyle); return this; } public WorkerBuilder makeFloor(String floorStyle) { roomParams.setFloor(floorStyle); return this; } public Room build() { // TODO Auto-generated method stub return room.freshRoom(roomParams); } class RoomParams{ public String window; public void setWindow(String window) { this.window = window; } public void setFloor(String floor) { this.floor = floor; } public String floor; }}
public class Client { //client 客户提出需求,造房子,并得到房子 //不关心过程和建造逻辑 public static void main(String[] args) { //1.提供具体建造者,链式编程 Room room=new WorkerBuilder().makeFloor("光滑地板").makeWindow("透明窗口").build(); //4.建造完成,验收 System.out.println("room建造完成:"+room.toString()); }}