设计模式(三):建造者模式
建造者模式
UML类图:
说明:
Director指挥者类可以调用所有建造者抽象类Builder1,Builder2,Builder3 ...
每一个建造者抽象类Builder只生产一类产品,类中分别规定了生产各个构件的方法,及最后创建完整产品的方法。
每一个建造者抽象类Builder都有对应的实现类ConcreteBuilder,在实现类中,实现Builder中的所有方法。
Product产品类,主要包含组合产品构件方法、展示完整产品方法,是产品的表示。
优点:
①因为将一个复杂产品的创建过程和其表示分离,使得同样的创建过程可以创建不同表示。
用户不必知道复杂产品的内部构成,直接使用某一创建过程(建造者类)创建,之后,因为创建过程和表示是分离的,所以创建结果可以表示为不同的产品,
②每一个建造者类独立,方便调用、替换、增改。
③面对非常复杂的产品,可以将其创建步骤分解到不同的建造者中,清晰化创建过程,更加精确地控制复杂产品的创建过程。
缺点:
①如果产品内部的变化或构成极其复杂,可能会需要定义很多建造者实现类(ConcreteBuilder)来实现这种变化,
会导致系统变得很庞大,增加了系统的理解难度和运行成本,也不易维护
②只适用于同类产品(内部结构相同)的创建,如果产品内部的构成或变化差异很大,则不适用此模式。
适用范围:创建具有复杂的内部结构,且内部属性本身相互依赖的产品。
客户端:
Director director = new Director(); //创建指挥者类
Builder builder1 = new ConcreteBuilder1(); //选中一类具体产品,实例化其建造类ConcreteBuilder1
director.construct1(builder1); //指挥者调用此建造类
Product product = builder1.getProduct(); //建造类ConcreteBuilder1来生产完整的此类产品
product.show(); //产品展示
// 同一个Builder可以创建不同的具体产品
Builder builder2 = new ConcreteBuilder2(); //选中另一类具体产品,实例化其建造类ConcreteBuilder2
director.construct1(builder2);
Product product2 = builder2.getProduct();
product2.show();
一句话概括:将一个复杂对象的构件和它的表示分离,使得同样的构建过程可以创建不同的表示
/** * 建造者模式 :将一个复杂对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 * * Builder BuilderOther (每个Builder只生产一类产品,包含生产各个构件的方法,及获取完整产品的方法) * ConcreteBuilder1 ConcreteBuilderImp2 ConcreteBuilderOther1 ConcreteBuilderOther2 (实现Builder的所有方法,会调用Product中的构件组合方法,以便创建产品) * * Director (选择生产哪种产品,指挥建造过程,即调用Builder中该产品各构件的产生方法) * * Product (提供构件组合方法,并负责将实例化的产品展示) */