建造者模式
这是本人第一次学习建造者模式,浅谈下自己的理解和展示下demo
理解
定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
建造者模式实现了组件的构造(Builder)和装配(Director)的分离
构造的不同或者装配的不同都可以导致最后得到不同的对象
举个例子:我们要组装一个火箭,火箭的结构分为轨道舱、逃逸塔和引擎
我们分别让不同的厂家负责这些零件的生产和装配
代码样例
首先我们定义一个火箭的对象实体类
为了贴合实际开发,我们将各个零件都定义为类,并简单赋予其name属性
public class AirShip {
/**
* 轨道模块
*/
private OrbitalModule orbitalModule;
/**
* 引擎
*/
private Engine engine;
/**
* 逃逸塔
*/
private EscapeTower escapeTower;
/**
* 发射方法
*/
public void launch() {
System.out.println("起飞!");
}
public AirShip(OrbitalModule orbitalModule, Engine engine, EscapeTower escapeTower) {
this.orbitalModule = orbitalModule;
this.engine = engine;
this.escapeTower = escapeTower;
}
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;
}
}
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;
}
}
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;
}
}
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;
}
}
然后我们来定义生产零件的厂家(也就是Builder)
简单设计一个接口和对应的实现类
public interface AirShipBuilder {
/**
* 创建引擎
* @return 返回引擎对象
*/
Engine createEngine();
/**
* 创建逃逸塔
* @return 返回逃逸塔对象
*/
EscapeTower createEscapeTower();
/**
* 创建轨道模块
* @return 返回轨道模块对象
*/
OrbitalModule createOrbitalModule();
}
public class AirBuilderImpl implements AirShipBuilder{
@Override
public Engine createEngine() {
System.out.println("创建引擎");
return new Engine("十年牌引擎");
}
@Override
public EscapeTower createEscapeTower() {
System.out.println("创建逃逸塔");
return new EscapeTower("十年牌逃逸塔");
}
@Override
public OrbitalModule createOrbitalModule() {
System.out.println("创建轨道舱");
return new OrbitalModule("十年牌轨道舱");
}
}
下一步,我们需要装配这些零件的部门(也就是Director)
public interface AirShipDirect {
/**
* 装配零件组成火箭
* @return 返回飞船
*/
AirShip createAirShip();
}
public class AirShipDirectImpl implements AirShipDirect{
private AirBuilderImpl airShipBuilder;
/**
* 构造方法,因为需要从生产者那里获取零件,所以我们把生产者当作参数传进来
* @param airShipBuilder 生产者
*/
public AirShipDirectImpl(AirBuilderImpl airShipBuilder) {
this.airShipBuilder = airShipBuilder;
}
@Override
public AirShip createAirShip() {
Engine engine = airShipBuilder.createEngine();
EscapeTower escapeTower = airShipBuilder.createEscapeTower();
OrbitalModule orbitalModule = airShipBuilder.createOrbitalModule();
return new AirShip(orbitalModule, engine, escapeTower);
}
}
最后,我们作为客户,只需要和生产部门和组装部门打交道就行
完全不需要关心火箭生产组装过程中的具体实现
public class Client {
public static void main(String[] args) {
// 只需和装配者以及生产者打交道,就能得到飞船了
AirShipDirectImpl airShipDirect = new AirShipDirectImpl(new AirBuilderImpl());
AirShip airShip = airShipDirect.createAirShip();
airShip.launch();
System.out.println("这个飞船的引擎是:" + airShip.getEngine().getName());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136823.html