标签:extend auto 定义 .net fresh dir 引用 逻辑 product
也叫做生成器模式,其定义如下:讲一个复杂的对象构建与他的表示分离,使得同样的创建过程可以创建不同的表示。
在建造者模式中,有四个角色:
通常是实现了模板方法,也就是有模板方法和基本方法。
产品的组建,一般由子类实现。
实现抽象类的具体方法,并且返回一个组建好的对象。
设计产品的构建方式,告知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(); } }
建造者模式优点:
使用场景:
扩展之链式编程:
建造者模式与工厂模式区别在于使用不同的顺序构造不同的对象,下面举一个例子(转载自博文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()); } }
标签:extend auto 定义 .net fresh dir 引用 逻辑 product
原文地址:https://www.cnblogs.com/loveBolin/p/9683798.html