三: 建造者模式
角色:
产品角色: 需要创建的实例对象表示类
抽象建造者: 定义创建产品的方法
具体建造者: 具体创建产品的逻辑
指挥者: 调用建造者创建产品
过程:
//产品:客厅 class Parlour { private String wall; //墙 private String TV; //电视 private String sofa; //沙发 public void setWall(String wall) { this.wall = wall; } public void setTV(String TV) { this.TV = TV; } public void setSofa(String sofa) { this.sofa = sofa; } public void show() { System.out.println("客厅建造好了,包含属性:"+ wall + "---"+ TV + "---" + sofa); } }
//抽象建造者:装修工人 abstract class Decorator { //创建产品对象 protected Parlour product = new Parlour(); //定义不同方法来填充产品中的属性 public abstract void buildWall(); public abstract void buildTV(); public abstract void buildSofa(); //返回产品对象 public Parlour getResult() { return product; } }
//具体建造者1(可以有多个建造者) class ConcreteDecorator1 extends Decorator { public void buildWall() { product.setWall("w1"); } public void buildTV() { product.setTV("TV1"); } public void buildSofa() { product.setSofa("sf1"); } }
//指挥者:通过构造函数传入具体的建造者 class ProjectManager { private Decorator builder; public ProjectManager(Decorator builder) { this.builder = builder; } //调用建造者的建造方法 public Parlour decorate() { builder.buildWall(); builder.buildTV(); builder.buildSofa(); return builder.getResult(); } }
工厂模式和建造者模式的差别:
工厂模式重视结果,通常返回的对象表现(属性)都一样,甚至就是创建一个对象给使用者,自己去赋值填充, 所以通常用于创建一些简单对象。
建造者模式重视过程,调用不同的建造者,创建出来的实例表现不一样。 通常也用于创建过程复杂的对象。