建造者模式(Builder Pattern)
什么是建造者模式?
建造者模式(Builder Pattern)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
建造模式的本质
- 分离了对象组件的单独构造(由Builder来负责)和装配(由Driector负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以产生不同的对象;相同的构建器,不同的装配顺序也可以产生不同的对象。也就是实现了构建算法,装配算法的解耦,实现了更好的复用。
使用场景
- 我们要建造一个复杂产品。比如:神舟飞船,Iphone。这个复杂产品的创建,有这样一个问题要处理:装配这些子组件是不是有个步骤问题?
- 实际开发中,我们所要构建的对象十分复杂,有很多步骤需要处理时。
Java中的应用场景
- StringBuilder类的append方法
- SQL中的PreparedStatement
- JDOM中,DomeBuiler,SAXBuilder
下面以建造神舟5号飞船说明,我们这里只是建造一个简单的神舟5号飞船了,它由发动机,逃逸塔,轨道舱组成,Builder负责构建这些组件,Driector负责将它们装配成神舟5号飞船。
类图
代码
package com.match.builder;
public interface AirShipBuilder { Engine builderEngine(); OrbitalModule builderOrbitalModule(); EscapeTower builderEscapeTower(); }
package com.match.builder;
public interface AirShipDirector { AirShip directAirShip(); }
package com.match.builder;
public class AirShip_5Builder implements AirShipBuilder { @Override public Engine builderEngine() { System.out.println("建造发动机"); return new Engine("神舟5号发动机"); } @Override public EscapeTower builderEscapeTower() { System.out.println("建造逃逸塔"); return new EscapeTower("神舟5号逃逸塔"); } @Override public OrbitalModule builderOrbitalModule() { System.out.println("建造轨道舱"); return new OrbitalModule("神舟5号轨道舱"); } }
package com.match.builder;
public class Airship_5Director implements AirShipDirector { private AirShipBuilder builder;
public Airship_5Director(AirShipBuilder builder) { this.builder = builder; } @Override public AirShip directAirShip() { Engine e = builder.builderEngine(); OrbitalModule o = builder.builderOrbitalModule(); EscapeTower et = builder.builderEscapeTower(); AirShip ship = new AirShip(); System.out.println("装配"+e.getName()); ship.setEngine(e); System.out.println("装配"+et.getName()); ship.setEscapeTower(et); System.out.println("装配"+o.getName()); ship.setOrbitalModule(o); return ship; } }
package com.match.builder;
public class Engine { private String name;
public Engine(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.match.builder;
public class EscapeTower { private String name; public EscapeTower(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.match.builder;
public class OrbitalModule { private String name;
public OrbitalModule(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.match.builder;
public class AirShip { private OrbitalModule orbitalModule; private Engine engine; private EscapeTower escapeTower; public void launch() { System.out.println("发射!"); } public OrbitalModule getOrbitalModule() { return orbitalModule; } public void setOrbitalModule(OrbitalModule orbitalModule) { this.orbitalModule = orbitalModule; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } public EscapeTower getEscapeTower() { return escapeTower; } public void setEscapeTower(EscapeTower escapeTower) { this.escapeTower = escapeTower; } }
|
测试代码:
package com.match.builder;
public class Client { public static void main(String[] args) { AirShipDirector director = new Airship_5Director(new AirShip_5Builder()); AirShip ship = director.directAirShip(); ship.launch(); } }
|
控制台输出:
建造发动机
建造轨道舱
建造逃逸塔
装配神舟5号发动机
装配神舟5号逃逸塔
装配神舟5号轨道舱
发射!