构造者模式
定义
Separate the construction of a complex object from its representation so that the same construction construction process can create different representations.
将一个复杂对象的创建过程从它的表示分离,使得同样的构建过程可以创建不同的表示;
分析
构造者模式关注的是“零件类型和装配工艺”,不同的装配顺序将产生不同的行为,但是对象的创建必须经过装配这一过程产生;
Client不必知道Product内部的组成细节,不同的构造者之间也是相互独立的;良好的封装性和扩展性;
将一个复杂对象的创建过程封装起来,允许对象通过多个步骤来创建,“构建过程”是客观存在的,没有该过程就不能得到对象,实际上,构造者模式就是通过对构建过程的封装与隔离实现“创建过程从它的表示分离”;
那么如果我们不用构建者模式,我们会怎样创建一个对象呢?直接调用构造函数、使用工厂方法,通过传入目标对象的特征以获得对象。简单对象的创建是没有问题的,但是复杂对象的创建,还应使用构造者模式。
比如,现在需要生成一个日程安排对象:内容包括旅馆,公园,餐厅、 特殊活动的任意组合;如果只有三种不同对象,即A套餐、B套餐、C套餐的话,使用工厂模式即可;但是现在是任意组合,那么决定权便在Director了。
实现
public class Product{ public void doSomething(){ //完成业务处理; } } public abstract class Builder{ public abstract void setPart(){//此处可以有参数,该函数可以有多个 //设置产品的不同部分,以获得不同的产品 } public abstract Product buildProduct(); } public class ConcreteProductBuilder extends Builder{ private Product product=new Product(); public void setPart(){//此处可以有参数,该函数可以有多个 //打造不同的产品 } public Product buildProduct(){ //进行一些内部操作,然后返回 return product; } } public class Director{ private Builder builder=new ConcreteProductBuilder(); public Product getAProduct(){ //开始调用不同的setPart方法,然后 return builder.buildProduct(); } }
体现的面向对象设计原则
Director类对外提供获得Product的方法;Builder类提供了构建一个对象可能用到的操作,通过继承Builder实现Builder类的可扩展性;符合单一职责原则、里氏替换原则、开闭原则、迪米特原则