java建造者模式(Builder)-创建型,javabuilder
java建造者模式(Builder)-创建型,javabuilder
意图
将一个产品的内部表象与产品的生产过程分割开来,从而使一个建造过程生成具有不同内部表象的产品对象。
产品的内部表象
一个产品通常由不同的组成成分作为产品的零件,这些零件有可能是对象,也有可能不是对象,他们通常被称为产品的内部表象(internal representation)。不同的产品有不同的的内部表象,也就是不同的零件。
使用建造者模式可以使客户端不需要知道所生成的产品对象有哪些零件,每个产品的对应零件彼此有何不同,是怎么建造出来的,以及怎样组装成产品的。
结构图
类图与角色
建造者接口(Builder):具体建造者必须实现的接口。为产品的每个零件声明一个建造方法,同时声明一个方法用于返回最终的产品对象。
具体建造者(Concrete Builder):对Builder接口的实现。
导演者(Director):调用具体建造者的建造方法来创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是建造者。
产品(Product):表示被构造的复杂对象。具体建造者创建该产品的内部表示并定义它的装配细节,由导演者控制整个构造流程。
实例
//建造者接口
interface Manufacture {//汽车制造商
public void setEngine();
public void setWheel();
public void setLight();
public void setSeat();
public Car getCar();
}
//具体建造者
class BMManufacture implements Manufacture{//宝马汽车制造商
private Car car;
public BMManufacture(){
car=new Car();
}
@Override
public void setEngine() {
System.out.println("获取德国引擎");
System.out.println("安装德国引擎");
}
@Override
public void setWheel() {
System.out.println("获取德国轮子");
System.out.println("安装美国轮子");
}
@Override
public void setLight() {
System.out.println("获取瑞士车灯");
System.out.println("安装瑞士车灯");
}
@Override
public void setSeat() {
System.out.println("获取法国座椅");
System.out.println("安装法国座椅");
}
@Override
public Car getCar() {
System.out.println("生产一辆宝马汽车!");
return car;
}
}
class DZManufacture implements Manufacture{//大众汽车制造商
private Car car;
public DZManufacture(){
car=new Car();
}
@Override
public void setEngine() {
System.out.println("获取上海引擎");
System.out.println("安装上海引擎");
}
@Override
public void setWheel() {
System.out.println("获取广州轮子");
System.out.println("安装广州轮子");
}
@Override
public void setLight() {
System.out.println("获取北京车灯");
System.out.println("安装北京车灯");
}
@Override
public void setSeat() {
System.out.println("获取杭州座椅");
System.out.println("安装杭州座椅");
}
@Override
public Car getCar() {
System.out.println("生产一辆大众汽车!");
return car;
}
}
//产品
class Car {
//零件 引擎
//零件 轮子
//零件 车灯
//零件 座椅
}
//导演者
class Workshop{//生产车间
public Car buildCar(Manufacture manu){
manu.setEngine();
manu.setWheel();
manu.setSeat();
manu.setLight();
return manu.getCar();
}
}
//客户端代码
class test {
public static void main (String[] args) throws java.lang.Exception{
Workshop workshop=new Workshop();
Manufacture manu=new BMManufacture();
Car car=workshop.buildCar(manu);
manu=new DZManufacture();
car=workshop.buildCar(manu);
}
}
适用场景
有些情况下,一个对象会有一些重要的属性,在它们没有恰当的赋值之前,对象不能作为完整的产品使用。例如,一个电子邮件包括发件人地址、收件人地址、主题、内容和附件等。而在最起码的收件人地址得到赋值之前,这个电子邮件不能发出。
有些情况下,一个对象的一些属性必须按照特定顺序赋值才有意义。例如,一个购物订单,包括商品名,商品价格、商品数量、折扣等,只有先确定商品价格和数量后,才能确定具体的折扣方案。
这时候,对象相当于一个有待建造的产品,而对象的这些属性相当于产品的零件,建造产品的过程是建造零件的过程。由于建造零件的过程很复杂,因此,这些零件的建造过程往往被外部化到另一个称为建造者的对象里,建造者对象返还给客户端的是一个全部零件都建造完成的产品对象。
总结:1、需要生成的产品对象有着复杂的内部结构。2、需要生成的产品对象的属性相互依赖。
建造者模式与抽象工厂模式的区别
抽象工厂模式中,每一次工厂对象的工厂方法被调用时都会返回一个完整的产品对象,而客户端有可能决定把这些产品组装成更大更复杂的产品,也有可能不会。建造者会一点一点的建造出一个复杂的产品,而这个产品的组装过程就发生在建造者内部,建造者模式的客户端拿到的是一个完整的最终产品。总而言之,抽象工厂处在更加具体的尺度上,而建造者模式处于更加宏观的尺度上。我们可以在建造者模式中嵌入抽象工厂模式,由抽象工厂模式来创建不同产品族的零件,而建造者模式则把他们组装起来。
相关文章
- 暂无相关文章
用户点评