(创建型模式)建造者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(创建型模式)建造者模式相关的知识,希望对你有一定的参考价值。

一、建造者模式(Builder Pattern):

  将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

二、应用场景:

  建立一个复杂产品,根据产品的类型决定实例化产品的结果,不需要考虑产品的构想过程。

三、应用实例:

  动物界的掌控者Tom,觉得出门走入太慢了,想建造一些车代步,但是目前还没有想好什么类型的车,建立一个车辆建造中心,能根据Tom大哥的车型要求,制造出指定的车型。(要求:具体的车型易扩展)

四、方案:

  UML图:

  技术分享

代码:

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class Car {
    private Model model;
    private Tire tire;
    private Door door;
    private Engine engine;

    public Model getModel() {
        return model;
    }

    public void setModel(Model model) {
        this.model = model;
    }

    public Tire getTire() {
        return tire;
    }

    public void setTire(Tire tire) {
        this.tire = tire;
    }

    public Door getDoor() {
        return door;
    }

    public void setDoor(Door door) {
        this.door = door;
    }

    public Engine getEngine() {
        return engine;
    }

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

}

 

复杂产品-车

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class Model {
    public Model(String str) {
        System.out.println("型号:" + str);
    }
}

 

产品组件-车型

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class Tire {
    public Tire(String str) {
        System.out.println("轮胎:" + str);
    }
}

 

产品组件-轮胎

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class Door {
    public Door(String str) {
        System.out.println("车门:" + str);
    }
}

 

产品组件-车门

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class Engine {
    public Engine(String str) {
        System.out.println("引擎:" + str);
    }
}

 

产品组件-引擎

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public abstract class BuildCar {
    protected Car car = new Car();

    public abstract void buildModel();

    public abstract void buildTire();

    public abstract void buildDoor();

    public abstract void buildEngine();

    public Car buildCar() {
        return car;
    }
}

 

抽象建造者-生产车厂

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class AudiCar extends BuildCar {

    @Override
    public void buildModel() {
        car.setModel(new Model("奥迪"));
    }

    @Override
    public void buildTire() {
        car.setTire(new Tire("米其林"));
    }

    @Override
    public void buildDoor() {
        car.setDoor(new Door("单门"));
    }

    @Override
    public void buildEngine() {
        car.setEngine(new Engine("A6发动机"));
    }
}

 

具体建造者-奥迪厂

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class BenzCar extends BuildCar {

    @Override
    public void buildModel() {
        car.setModel(new Model("奔驰"));
    }

    @Override
    public void buildTire() {
        car.setTire(new Tire("阿莫西林"));
    }

    @Override
    public void buildDoor() {
        car.setDoor(new Door("双门"));
    }

    @Override
    public void buildEngine() {
        car.setEngine(new Engine("N3发动机"));
    }
}

 

具体建造者-奔驰厂

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class CarManager {
    public Car getCar(BuildCar buildCar) {
        buildCar.buildModel();
        buildCar.buildTire();
        buildCar.buildDoor();
        buildCar.buildEngine();
        Car car = buildCar.buildCar();
        return car;
    }
}

 

指挥者-车辆制造指挥中心

package com.yq.test;

/**
 * Created by yq on 2016/11/23.
 */
public class CarClient {
    public static void main(String[] args) {
        CarManager cm = new CarManager();
        System.out.println("=========audi=========");
        Car audi = cm.getCar(new AudiCar());
        System.out.println(" ");
        System.out.println("=========benz=========");
        Car benz = cm.getCar(new BenzCar());
    }
}
//output
=========audi=========
型号:奥迪
轮胎:米其林
车门:单门
引擎:A6发动机
 
=========benz=========
型号:奔驰
轮胎:阿莫西林
车门:双门
引擎:N3发动机

 

客户端调用-客户订制车

备注:客户端只需实例化指挥者类,指挥者类针对抽象建造者编程,客户端根据需要传入具体的建造者类型,指挥者将指导具体建造者一步一步构造一个完整的产品。

   如果要扩展具体的车场,只需新增一个具体建造者类继承抽象建造者BuildCar即可,符合开闭原则。

 

以上内容,纯属个人见解,如有错误,望不吝指正。

 

以上是关于(创建型模式)建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 创建型模式_建造者模式

设计模式 - 创建型模式_建造者模式

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)

创建型模式之建造者模式实例及代码操作

Python 设计模式 — 创建型模式 — 建造者模式

Python 设计模式 — 创建型模式 — 建造者模式