这篇文章主要向大家讲解什么是建造者模式,建造者模式的实例讲解及应用场景等知识点。
用户可以不知道产品的构建细节直接可以创建复杂的对象,主要是分离了产品的构建和装配,这样就实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象,这样就实现了的复用性和。
举例说明:
比如我们组建一个造飞船和装配飞船。
说明:
(1)、装配者(Director)直接和客户(Client)进行交流;交流后装配者将客户创建产品的需求划分为几个部分去请求(Builder)去做,
(2)、抽象的建造者(Builder)请求委派到具体的建造者(AirBuilder);各个具体建造者负责进行产品部件的构建;最终构建成具体产品(Product)。
其实很类似苹果的代工厂 苹果公司管产品的设计,设计出来的产品,交给中国大陆的代工厂去组装生产。
下面让我们来做一个具体的实例来讲解建造者模式:
飞船实例:
假设飞船(AirShip)由三个零部件组成(引擎,轨道窗,发射塔),那么这些零部件的创建就交给我们的建造者实现,抽象的建造者(AirShipBuilder)交给具体的建造者(ZgAirShipBuilder)来完成这些零部件的生产。
具体的装配者(ZgrAirShipDirector)只需要把建造者生产出来的零部件组装起来,客户端只需要与装配者打交道即可。
具体的实现代码如下:
飞船的组装零件(Engine,EscapeTower,OrbitaModule)
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; } } 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; } } public class OrbitaModule { private String name; public OrbitaModule(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
飞船
/** * @author 13394 */ public class AirShip { private EscapeTower escapeTower; private Engine engine; private OrbitaModule orbitaModule; public AirShip(EscapeTower escapeTower, Engine engine, OrbitaModule orbitaModule) { this.escapeTower = escapeTower; this.engine = engine; this.orbitaModule = orbitaModule; } public EscapeTower getEscapeTower() { return escapeTower; } public void setEscapeTower(EscapeTower escapeTower) { this.escapeTower = escapeTower; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } public OrbitaModule getOrbitaModule() { return orbitaModule; } public void setOrbitaModule(OrbitaModule orbitaModule) { this.orbitaModule = orbitaModule; } }
建造者 (AirShipBuilder,ZgAirShipBuilder)
public interface AirShipBuilder { Engine getEngine(); EscapeTower getEscapeTower(); OrbitaModule getOrbitaModule(); } public class ZgAirShipBuilder implements AirShipBuilder { @Override public Engine getEngine() { System.out.println("构造发动机!!!!!!!!!!!!!"); return new Engine("发动机"); } @Override public EscapeTower getEscapeTower() { System.out.println("构造逃逸塔!!!!!!!!"); return new EscapeTower("逃逸塔"); } @Override public OrbitaModule getOrbitaModule() { System.out.println("构造轨道舱!!!!!!!!!!!!"); return new OrbitaModule("轨道舱"); } }
装配者(AirShipDirector,ZgrAirShipDirector)
public interface AirShipDirector { public AirShip directAirShip(); } public class ZgrAirShipDirector implements AirShipDirector { private AirShipBuilder airShipBuilder; public ZgrAirShipDirector(AirShipBuilder airShipBuilder) { this.airShipBuilder = airShipBuilder; } @Override public AirShip directAirShip() { Engine engine = airShipBuilder.getEngine(); EscapeTower escapeTower = airShipBuilder.getEscapeTower(); OrbitaModule orbitaModule = airShipBuilder.getOrbitaModule(); AirShip airShip = new AirShip(escapeTower, engine, orbitaModule); return airShip; } }
客户端(Client)调用
public class Client { public static void main(String[] args) { AirShipDirector airShipDirector=new ZgrAirShipDirector(new ZgAirShipBuilder()); airShipDirector.directAirShip(); } }
通过以上这个飞船的例子我相信大家已经明白什么是建造者模式了吧!!!!!!!!!!
开发中应用场景: StringBuilder类的append方法 SQL中的 PreparedStatement JDOM中DomBuilder、SAXBuilder
那么建造者模式有什么优点和缺点呢?
优点:
缺点:
请帮忙点个赞,因为你的鼓励是我创作最大的动力!