生成器模式

设计模式----生成器模式

生成器模式(又称建造者模式)属于创建型模式,其是将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它按照一个指定的过程逐步创建一个复杂对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,而不必知道内部的具体构建细节。

​建造者模式包含的各组成部分意义如下:

​(1)Builder:创建Product对象的抽象接口。

​(2)ConcreteBuilder:

​ ① 通过对抽象的Builder接口的具体实现,创建并组装创建这些对象的“零件”。

​ ② 定义并且跟踪它所创建的产品的表示。

​ ③ 提供一个接口以便能被调用,得到产品对象。

​(3)Director:使用Builder接口创建一个完整产品对象,它负责管理正确的对象创建顺序,从参数中接受具体的ConcreteBuilder对象,并且执行这些对象的必要操作。

​(4)Product

​ ① 代表待创建的复杂对象,是ConcreteBuilder负责创建对象的内部表示,并且定义组装过程。

​ ② 包含定义产品组件的子类,包括一个组装接口。

​ 注意:产品类可以是一个单独类,也可以是一个带有子类的类结构体。是单独类时,ConcreteBuilder负责创建该单独类对象的内部表示;是类结构体时,ConcreteBuilder根据需要创建该类所需要的子类的对象的内部表示,然后在一起。

​建造者模式特点:

​ (1)建造者模式让用户可以变化它建造产品的内部表达形式,它隐藏了产品是怎样被装配的细节。

​ (2)每个具体的建造者都独立于程序的其他建造者,因此改善了程序的模块化,并且使添加其他建造者变得相对简单。

​ (3)由于每个建造者根据数据逐步构建最终产品,用户对建造者的最终产品有更多控制。

​ (4)其和抽象工厂模式有相似之处,都返回由其他一些对象组成的类的对象。区别是,抽象工厂模式返回一个类族,而建造之模式逐步按照次序构建一个复杂的对象,最后返回该对象。

​ 例如,在同一品牌情况下,客户会提出汽车部件的具体要求,如安装高等级的轮胎、天窗、巡航控制和卫星导航系统等。这样就要求将汽车的实际装配过程与具体的部件分离出来,为此汽车制造公司成立了指导部(Director),该部门负责规范汽车的装配流程和客户要求达到一致。

​ 汽车是一个比较复杂的对象,其组成包括底盘(Chassis)、外壳(Frame)、轮子(Wheels)、引擎(Engine)、油箱(GasTank)、油门(Accelerater)、刹车(Brake)、方向盘(SteeringWheel)、电池(Battery)、音响(Audio)、天窗(Sunroof)、巡航控制系统(Cruise Control)、卫星导航系统(GPS)等等。其装配过程用以下按照顺序写出来:buildChassis(); buildFrame(); buildWheels(); buildEngine(); buildGasTank(); buildAccelerater(); buildBrake(); buildSteeringWheel(); buildBattery(); buildAudio(); buildSunroof(); buildCruiseContorl(); buildGPS();

在这里插入图片描述

抽象建造者

package cn.szxy.hq;

/**
 * 建造者接口
 *
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/26.
 */
public interface Builder {

    Product product = new Product();

    void buildChassis();

    void buildFrame();

    void buildWheels();

    void buildEngine();

    void buildGasTank();

    void buildAccelerater();

    void buildBrake();

    void buildSteeringWheel();

    void buildBattery();

    void buildAudio();

    void buildSunroof();

    void buildCruiseContorl();

    void buildGPS();

    Product getResult();
}

具体建造者

package cn.szxy.hq;

/**
 * 具体建造者
 *
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/26.
 */
public class ConcreteBuilder implements Builder {
    @Override
    public void buildChassis() {
        product.setChassis("装配底盘");
    }

    @Override
    public void buildFrame() {
        product.setFrame("装配外壳");
    }

    @Override
    public void buildWheels() {
        product.setWheels("装配轮子");
    }

    @Override
    public void buildEngine() {
        product.setEngine("装配引擎");
    }

    @Override
    public void buildGasTank() {
        product.setGasTank("装配邮箱");
    }

    @Override
    public void buildAccelerater() {
        product.setAccelerater("装配油门");
    }

    @Override
    public void buildBrake() {
        product.setBrake("装配刹车");
    }

    @Override
    public void buildSteeringWheel() {
        product.setSteeringWheel("装配方向盘");
    }

    @Override
    public void buildBattery() {
        product.setBattery("装配电池");
    }

    @Override
    public void buildAudio() {
        product.setAudio("装配音响");
    }

    @Override
    public void buildSunroof() {
        product.setSunroof("装配天窗");
    }

    @Override
    public void buildCruiseContorl() {
        product.setCruiseControl("装配巡航控制");
    }

    @Override
    public void buildGPS() {
        product.setGps("装配GPS");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

指挥者

package cn.szxy.hq;

/**
 * 指挥者
 *
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/26.
 */
public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }
    /**
     * 产品构建组装方法
     *
     * @return
     */
    public Product construct() {
        builder.buildChassis();
        builder.buildFrame();
        builder.buildWheels();
        builder.buildGasTank();
        builder.buildAccelerater();
        builder.buildBrake();
        builder.buildSteeringWheel();
        builder.buildBattery();
        builder.buildAudio();
        builder.buildSunroof();
        builder.buildCruiseContorl();
        builder.buildGPS();
        return builder.getResult();

    }
}

产品角色

package cn.szxy.hq;

import com.sun.xml.internal.ws.api.ha.StickyFeature;

/**
 * 产品类
 *
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/26.
 */
public class Product {
    private String chassis;
    private String frame;
    private String wheels;
    private String engine;
    private String gasTank;
    private String accelerater;
    private String brake;
    private String steeringWheel;
    private String battery;
    private String audio;
    private String sunroof;
    private String cruiseControl;
    private String gps;

    public void setChassis(String chassis) {
        this.chassis = chassis;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public void setWheels(String wheels) {
        this.wheels = wheels;
    }

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public void setGasTank(String gasTank) {
        this.gasTank = gasTank;
    }

    public void setAccelerater(String accelerater) {
        this.accelerater = accelerater;
    }

    public void setBrake(String brake) {
        this.brake = brake;
    }

    public void setSteeringWheel(String steeringWheel) {
        this.steeringWheel = steeringWheel;
    }

    public void setBattery(String battery) {
        this.battery = battery;
    }

    public void setAudio(String audio) {
        this.audio = audio;
    }

    public void setSunroof(String sunroof) {
        this.sunroof = sunroof;
    }

    public void setCruiseControl(String cruiseControl) {
        this.cruiseControl = cruiseControl;
    }

    public void setGps(String gps) {
        this.gps = gps;
    }

    public void show() {
        System.out.println("这是宝马520!");
    }
}

客户端驱动

package cn.szxy.hq;

/**
 * 客户端
 * @author HQ
 * @e-mail ahmashq95@gmail.com
 * @date 2018/11/26.
 */
public class Driver {
    public static void main(String[] args) {
        Builder builder=new ConcreteBuilder();
        Director director=new Director(builder);
        Product product=director.construct();
        product.show();
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值