设计模式之建造者
/**
* 建造者模式:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以有不同的表示。
* 建造者模式通常包括以下这几个角色:
1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口只是定一个规范,不涉及具体的建造,具体的建造让继承于它的子类(ConcreteBuilder)去实现。
2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,具体化各对象部分的建造,最后返回一个建造好的产品。
3、Director:导演,顾名思义,负责规范流程之用。在指导中不涉及产品的创建,只负责保证复杂对象各部分被创建或按某种顺序创建。
4、Product:复杂对象。
*
*使用建造者模式的好处
1.使用建造者模式可以使客户端不必知道产品内部组成的细节。
2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。
3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
*例如: 造桌子
*/
//桌子: 对象之间解耦合
public class Product {
private Desktop desktop; //桌面
private Deskleg deskleg; //桌腿
public static void main(String args[]){
//对于客户端而言,只需要关心具体的建造者,无需关心产品内部构建流程
Builder builder = new Builder();
Director director = new Director(builder);
// 指挥者负责流程把控
director.construct();
// 建造者返回一个组合好的复杂产品对象
Product desk = builder.getDesk();
}
public Desktop getDesktop() {
return desktop;
}
public void setDesktop(Desktop desktop) {
this.desktop = desktop;
}
public Deskleg getDeskleg() {
return deskleg;
}
public void setDeskleg(Deskleg deskleg) {
this.deskleg = deskleg;
}
}
class Desktop{
private int length;
private int width;
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
}
class Deskleg{
private int length; //长
private int width; //宽
private int height; //高
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
public class Director {
private AbstractBuilder builder;
public Director(AbstractBuilder builder){
this.builder = builder;
}
// 这个方法用来规范流程,产品构建和组装方法
public void construct() {
builder.buildDesktop();
builder.buildDeskleg();
}
}
public class Builder extends AbstractBuilder {
private Product product;
public Builder(){
product = new Product();
}
//建造桌面
void buildDesktop() {
Desktop desktop = new Desktop();
desktop.setLength(100);
desktop.setWidth(80);
product.setDesktop(desktop);
}
//建造桌腿
void buildDeskleg() {
Deskleg deskleg = new Deskleg();
deskleg.setHeight(120);
deskleg.setLength(10);
deskleg.setWidth(10);
product.setDeskleg(deskleg);
}
public Product getDesk(){
return product;
}
}
public abstract class AbstractBuilder {
abstract void buildDesktop();
abstract void buildDeskleg();
}