定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
类型:创建类模式
类图:
四个要素
代码实现
产品的抽象类:
package builder; import java.util.arraylist; public abstract class abstractproduct { //记录执行顺序 private arraylist<string> part = new arraylist<string>(); public abstract void dosomething(); public abstract void dootherthing(); //final,子类不可重写 final public void executive(){ for(int i=0;i<this.part.size();i++){ string actionname = this.part.get(i); if(actionname.equals("dosomething")){ this.dosomething(); } else if(actionname.equals("dootherthing")){ this.dootherthing(); } } } //final,子类不可重写 final public void setpart(arraylist<string> part){ this.part = part; } }
产品的实现类:
package builder; public class product extends abstractproduct{ //子类具体描述步骤 public void dosomething(){ system.out.println("will do something..."); } public void dootherthing() { system.out.println("something has done.otherthing will be done..."); } }
建造者抽象类:
package builder; import java.util.arraylist; public abstract class builder { //设置产品的不同部分,以获得不同的产品 public abstract void setpart(arraylist<string> part); //建造产品 public abstract product buildproduct(); }
建造者实现类:
package builder; import java.util.arraylist; public class concreteproduct extends builder{ private product product = new product(); public void setpart(arraylist<string> part) { this.product.setpart(part); } public product buildproduct() { return this.product; } }
导演类:
package builder; import java.util.arraylist; //对不同产品的生产顺序再封装,对高层屏蔽细节 public class director { private arraylist<string> part = new arraylist<string>(); private builder builder = new concreteproduct(); public product getaproduct() { this.part.clear(); this.part.add("dosomething"); this.part.add("dootherthing"); builder.setpart(part); return builder.buildproduct(); } }
客户端:
package builder; public class client { public static void main(string[] args) { director director = new director(); system.out.println("将产生10个产品"); for(int i=1;i<11;i++){ system.out.println("第" + i + "个产品"); director.getaproduct().executive(); system.out.println(); } } }
建造者模式的优点
首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。
建造者模式与工厂模式的区别
我们可以看到,建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。
总结
建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。
如对本文有疑问, 点击进行留言回复!!
[杭电多校2020]第一场 1004 Distinct Sub-palindromes
Swift -- 将本地生成的UIImage进行持久化保存(存到文件中fileManager.createFile)
网友评论