5.建造者模式(Builder Pattern)
程序员文章站
2022-05-04 22:22:52
...
1.定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.注意事项 :
建造者模式关注的是零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。
建造者模式和工厂方法模式非常相像,以下是它们之间的区别:
建造者模式最主要的功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的讲就是零件的装配,顺序不同产生的对象也不同;而工厂方法模式则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的 。
3.建造者模式的使用场景:
- 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
- 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。
4.通用代码:
package _5BuilderPattern; // 产品类 public class Product { public void doSomething1() { // 独立业务处理 } public void doSomething2() { // 独立业务处理 } }
package _5BuilderPattern; // 抽象建造者 public interface Builder { // 设置产品的不同部分(以不同的顺序调用产品方法) public void setPart(Object obj); // 建造产品 public Product buildProduct(); }
package _5BuilderPattern; import java.util.List; // 具体建造者 public class ProductBuilder implements Builder { private Product product = new Product(); @SuppressWarnings("unchecked") @Override public void setPart(Object obj) { // 这里方法的调用顺序不同,就产生了建造的产品不一样 // 该顺序可以在导演类(下面会介绍)中通过参数的形式的决定 List<String> methods = (List<String>)obj; for (String methodString : methods) { if(methodString.equals("doSomething1")) { product.doSomething1(); } else if(methodString.equals("doSomething2")) { product.doSomething2(); } } } @Override public Product buildProduct() { return product; } }
package _5BuilderPattern; import java.util.ArrayList; import java.util.List; // 导演类 public class Director { private Builder builder = new ProductBuilder(); // 构建不同的产品 public Product getProduct() { List<String> methods = new ArrayList<String>(); methods.add("doSomething2"); methods.add("doSomething1"); builder.setPart(methods); return builder.buildProduct(); } }
此处使用了导演类,该类起到封装的作用,避免高层模块深入到建造者内部的实现类。当然,在建造者模式较庞大时,导演类可以有多个。
5.建造者模式的优点:
- 封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节
- 建造者独立,容易扩展
- 便于控制细节风险
上一篇: 单例,多例,建造者模式总结
下一篇: 创建类模式大PK(总结)