第一次好好的看设计模式,可能有不对的地方,大佬们可以下面指出,感谢!
----------- 分割线 ----------
UML图:
找了张网图,自己就不画了。
作用:
可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就可以不用知道了。
使用场景:
1:当复杂对象需要与表示分离,可能需要创建不同的表示时;
2:当需要向客户隐藏产品内部结构的表现时;
今天拿开发一款软件产品为例:
首先定义产品类:
@Data public class Product { private String proName;//产品名称 private Date endDate;//产品研发结束时间 private String demand;//产品需求 private String model;//产品模型 private List<String> tables;//产品数据表 private String ui;//产品ui }
定义产品的建造器:
public abstract class ProductBuilder { abstract void buildDemand(); abstract void buildModel(); abstract void buildui(); abstract void buildTables(); abstract void buildEndDate(); abstract void showProduct(); }
定义指挥者:
public class Dircetor { private ProductBuilder productBuilder; public Dircetor(ProductBuilder productBuilder) { this.productBuilder = productBuilder; } public void startBuild() { productBuilder.buildDemand(); productBuilder.buildModel(); productBuilder.buildui(); productBuilder.buildTables(); productBuilder.buildEndDate(); } }
定义微博产品,实现产品建造器:
public class Weibo extends ProductBuilder { private Product product; public Weibo(){ this.product = new Product(); product.setProName("微博"); } @Override void buildDemand() { System.out.println("开始制定微博需求"); product.setDemand("微博需求:娱乐民众"); } @Override void buildModel() { System.out.println("开始制定微博原型"); product.setModel("这是微博的原型"); } @Override void buildui() { System.out.println("开始制定微博UI图"); product.setUi("这是微博的ui图"); } @Override void buildTables() { System.out.println("开始制定微博数据库表"); List<String> tables = Arrays.asList(new String[] {"table_a","table_b","table_c"}); product.setTables(tables); } @Override void buildEndDate() { System.out.println("需求分析结束,制定项目研发最终日期"); product.setEndDate(new Date()); } @Override void showProduct() { System.out.println(JSON.toJSONString(product)); } }
程序调用:
public class Main { public static void main(String[] args){ ProductBuilder weiboBuiler = new Weibo(); Dircetor dircetor = new Dircetor(weiboBuiler); dircetor.startBuild(); System.out.println("------------分割线--------------"); weiboBuiler.showProduct(); } }
控制台输出:
开始制定微博需求 开始制定微博原型 开始制定微博UI图 开始制定微博数据库表 需求分析结束,制定项目研发最终日期 ------------分割线-------------- Disconnected from the target VM, address: '127.0.0.1:60596', transport: 'socket' {"demand":"微博需求:娱乐民众","endDate":1564390022604,"model":"这是微博的原型","proName":"微博","tables":["table_a","table_b","table_c"],"ui":"这是微博的ui图"} Process finished with exit code 0