建造者模式再生活中很常见,以盖房子为例,如果想盖一栋写字楼,业主可以公开招标,建筑单位负责施工,设计单位负责出图。单单从施工过程来看,肯定是由项目经理来负责项目的进行,盖房子需要很多材料,钢筋、水泥、砖等,这些不可能由项目经理自己去生产这些材料,而是联系建材商负责提供,然后由一线工人负责实际的生产,项目经历更多的是承担一个指挥者的角色,实际的工作是由工人来完成的。
再建造者模式中,主要由四个关键部分组成:
①产品:实际要生产的东西,比如房子,组成部分大同小异,但是每一个构件的材料可以不同;
②抽象建造者:包括建造每一部分的抽象方法和返回产品的方法;
③具体建造者:实现抽象方法;
④指挥者
建造者模式代码示例:
package newcoder.Builder; /* 建造者模式由四部分组成: 1、产品 2、抽象建造者,包括建造每一部分的抽象方法和返回产品的方法 3、具体建造者,继承抽象建造者,实现抽象方法 4、指挥者 */ class productHouse{ private String sofa; private String TV; private String desk; public String getSofa() { return sofa; } public void setSofa(String sofa) { this.sofa = sofa; } public String getTV() { return TV; } public void setTV(String TV) { this.TV = TV; } public String getDesk() { return desk; } public void setDesk(String desk) { this.desk = desk; } @Override public String toString() { return "房子里面有:"+this.desk+"\n"+this.sofa+"\n"+this.TV; } } abstract class builder{ protected productHouse producthouse = new productHouse(); public abstract void addSofa(String band); public abstract void addDesk(String band); public abstract void addTV(String band); public productHouse getResult(){ return producthouse; } } class concreteBuilder extends builder{ public void addSofa(String band){ producthouse.setSofa(band); } public void addDesk(String band){ producthouse.setDesk(band); } public void addTV(String band){ producthouse.setTV(band); } } class Director{ private builder bd; public Director(builder bd){ this.bd = bd; } public productHouse command(){ bd.addDesk("红木桌子"); bd.addSofa("皮沙发"); bd.addTV("长虹电视"); return bd.getResult(); } } public class BuilderTest { public static void main(String args[]){ productHouse myhouse; builder a = new concreteBuilder(); Director d = new Director(a); myhouse = d.command(); System.out.println(myhouse); } }
建造者(Builder)模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定,所以它通常在以下场合使用。
- 创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
- 创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。