编程语言 php java

java设计模式-建造者模式

java HTML我帮您 1年前  0次浏览
1.概念

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 <构建与表示分离,同构建不同表示>

与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造过程。

  建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心。

  举个简单的例子,如汽车,有很多部件,车轮,方向盘,发动机还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一部汽车,这个装配过程也很复杂(需要很好的组装技术), builder模式就是为了将部件和组装分开。

interface Bulider{
public void part01();

public void part02();

public void part03();

// 模板方法给出了默认的组装方式,生成默认的建造者
public Bulider getBulider();

}
//抽象建造者类,使用了模板方法模式,不同建造者有不同的“组成部分part”
abstract class AbstractBulider implements Bulider{
public abstract void part01();

public abstract void part02();

public abstract void part03();

// 模板方法给出了默认的组装方式,生成默认的建造者
public Bulider getBulider() {
part01();
part02();
part03();
return this;// 返回当前对象,即默认组装方式的建造者
}
}

// 具体的建造者A、B,不同建造者实现了不同的“组成部分part”
class BuliderA extends AbstractBulider {
public void part01() {
System.out.println("建造者A :part01() ...");
}

public void part02() {
System.out.println("建造者A :part02() ...");
}

public void part03() {
System.out.println("建造者A :part03() ...");
}
}

class BuliderB extends AbstractBulider {
public void part01() {
System.out.println("建造者B :part01() ...");
}

public void part02() {
System.out.println("建造者B :part02() ...");
}

public void part03() {
System.out.println("建造者B :part03() ...");
}

public Bulider getBulider() {
part01();
part03();
part02();
return this;// 返回当前对象,即默认组装方式的建造者
}
}


class Director {
private Bulider product;

public Director(Bulider product){
this.product = product;
}
public Bulider getBulider() {
product.getBulider();
return product;
}

}
// 测试类
public class Client {
public static void main(String<> args) {
System.out.println("利用模板方法模式获得默认的建造者A");
new BuliderA().getBulider();

System.out.println("\n利用Director类获得组装方式的建造者A");
BuliderA productA = new BuliderA();
Director director = new Director(productA);
director.getBulider();

System.out.println("\n利用Director类获得组装方式的建造者B");
BuliderB productB = new BuliderB();
Director directorB = new Director(productB);
directorB.getBulider();

}
}
建造者模式的应用

1. 建造者模式的优点

封装性

使用建造者模式可以使客户端不必知道产品内部组成的细节,如例子中我们就不需要关心每一个具体的模型内部是如何实现的,产生的对象类型就是CarModel。

建造者独立,容易扩展

BuilderA和BuilderB是相互独立的,对系统的扩展非常有利。

便于控制细节风险

由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

2. 建造者模式的使用场景

相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式是非常合适。
在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景,只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反设计最初目标。

3. 建造者模式的注意事项

建造者模式关注的是的零件类型和装配工艺(顺序),这是它与工厂方法模式最大不同的地方,虽然同为创建类模式,但是注重点不同。

建造者模式的扩展

已经不用扩展了,因为我们在汽车模型制造的例子中已经对建造者模式进行了扩展,引入了模板方法模式,可能大家会比较疑惑,为什么在其他介绍设计模式的书籍上创建者模式并不是这样说的,读者请注意,建造者模式中还有一个角色没有说明,就是零件,建造者怎么去建造一个对象?是零件的组装,组装顺序不同对象效能也不同,这才是建造者模式要表达的核心意义,而怎么才能更好的达到这种效果呢?引入模板方法模式是一个非常简单而有效的办法。

大家看到这里估计就开始犯嘀咕了,这个建造者模式和工厂模式非常相似呀,Yes,是的,是非常相似,但是记住一点你就可以游刃有余的使用了:建造者模式最主要功能是基本方法的调用顺序安排,也就是这些基本方法已经实现了,通俗的说就是零件的装配,顺序不同产生的对象也不同;而工厂方法则重点是创建,创建零件时它的主要职责,你要什么对象我创造一个对象出来,组装顺序则不是他关心的。

最佳实践

再次说明,在使用建造者模式的时候考虑一下模板方法模式,别孤立的思考一个模式,僵化的套用一个模式会让受害无穷!

发表评论