再战设计模式(三)之建造者模式

建造者模式

他的本质主要是:

分离了组件的构造(由builder来负责),和装配(由Director负责),从而构造出复杂的对象,这个模式使用于:某个对象构建过程复杂的情况下使用

建造模式可以将一个产品的内部表象(internal representation)与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

由于实现了构建和装配的解耦。不同的构建器和不同的装配器 可以组合成很多不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用

场景:

在日常开发中,有时候我们需要一个复杂的对象.由于需求的原因.但是其中各部分的子对象经常变化,但是我们可以让他们组合起来相对简单稳定

使用场景. 1.我们需要很多零件 2.我们要把这些零件组装起来 当然在工作中,可能要和工厂模式搭配起来使用

代码:

这些实例可以使用简单工厂模式来生成不同的发动机 座椅啊.轮胎啊.

/**
 * 汽车
 * @Created by xiaodao
 */
public class Car {

    private Seat seat;
    private Engine engine;//发动机

    private Tyre tyre;//轮胎

    public Car(Seat seat, Engine engine, Tyre tyre) {

        this.seat = seat;
        this.engine = engine;
        this.tyre = tyre;
    }

    public Seat getSeat() {
        return seat;
    }

    public void setSeat(Seat seat) {
        this.seat = seat;
    }

    public Engine getEngine() {
        return engine;
    }

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

    public Tyre getTyre() {
        return tyre;
    }

    public void setTyre(Tyre tyre) {
        this.tyre = tyre;
    }
}

/**
 * @Created by xiaodao
 * 引擎实例
 */
public class Engine {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Engine(String name) {
        this.name = name;
    }
}

/**
 * @Created by xiaodao
 * 座椅
 */
public class Seat {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Seat(String name) {
        this.name = name;
    }
}

/**
 * @Created by xiaodao
 *轮胎
 */
public class Tyre {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Tyre(String name) {
        this.name = name;
    }
}

builder接口:

/**
 * @Created by xiaodao
 * 构建接口 这里也可以是抽象方法
 */
public interface CarBuilder {

    /**
     * 构建引擎
     *
     * @return
     */
    Engine builderEngine();

    Seat builderSeat();

    Tyre builderTyre();
}

builder实现类:

/**
 * @Created by xiaodao
 */
public class AudiCarBuilderImpl implements CarBuilder {
    @Override
    public Engine builderEngine() {
        return new Engine("奥迪引擎");
    }

    @Override
    public Seat builderSeat() {
        return new Seat("奥迪座椅");
    }

    @Override
    public Tyre builderTyre() {
        return new Tyre("奥迪轮胎");
    }
}

direactor:用来引入builder类的引用.他不知道builder的子类是什么

/**
 * @Created by xiaodao
 */
public class CarDirector {

    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    /**
     * 装配汽车
     * @return
     */
    public Car directCar(){

        Engine engine = builder.builderEngine();
        Seat seat = builder.builderSeat();
        Tyre tyre = builder.builderTyre();
        return new Car(seat,engine,tyre);
    }
}

调用者:

public class Client {
    public static void main(String[] args) {

        CarDirector carDirector = new CarDirector(new AudiCarBuilderImpl());
        Car car = carDirector.directCar();
        System.out.println(car.getEngine().getName());
        System.out.println(car.getSeat().getName());
        System.out.println(car.getTyre().getName());
    }
}

奥迪引擎
奥迪座椅
奥迪轮胎

类图:

登场角色

builder角色负责定义用户生成实例的接口

concreteBuilder(具体的builder) concreteBuilder角色是实现了Builder接口的类.定义了具体的方法

director(监工) 负责使用builder角色的接口来生成实例,他不依赖与Builder的子类 无论子类如何定义都不影响 director的使用

client 具体的调用者

这里我们可以把car 的各种属性变成工厂模式

总结:

建造者模式与抽象工厂模式相似.(director 和abstractFactory 的实现类)今天下午与同事讨论半天总是在这方面比较模糊.欢迎大家踊跃评论.

个人感觉工厂模式是用于创建什么样的对象

建造模式就用来怎么创建对象

工厂方法模式和建造者模式都属于对象创建类模式,都用来创建类的对象。但它们之间的区别还是比较明显的。  

下面来自某位群友的讲解

 ● 意图不同  

   在工厂方法模式里,我们关注的是一个产品整体,如超人整体,无须关心产品的各部分是如何创建出来的;但在建造者模式中,一个具体产品的产生是依赖各个部件的产生以及装配顺序,它关注的是“由零件一步一步地组装出产品对象”。简单地说,工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象,关注的是产品组成部分的创建过程。  

 ● 产品的复杂度不同   

  工厂方法模式创建的产品一般都是单一性质产品,如成年超人,都是一个模样,而建造者模式创建的则是一个复合产品,它由各个部件复合而成,部件不同产品对象当然不同。这不是说工厂方法模式创建的对象简单,而是指它们的粒度大小不同。一般来说,工厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。   两者的区别有了,那在具体的应用中,我们该如何选择呢?是用工厂方法模式来创建对象,还是用建造者模式来创建对象,这完全取决于我们在做系统设计时的意图,如果需要详细关注一个产品部件的生产、安装步骤,则选择建造者,否则选择工厂方法模式。

原文地址:https://www.cnblogs.com/bj-xiaodao/p/10831441.html

时间: 2024-10-17 01:59:59

再战设计模式(三)之建造者模式的相关文章

再战设计模式(四)之原型模式

原型模式(prototype) 这个模式一般在工作中很少用,但是在框架里可能经常有,它是在什么情况下用呢?比如我们创建一个对象,需要10ms,在创建一个对象也需要10ms,这样就很耗时.. 举一个很简单的例子.小A在考试,做一份卷子需要一个小时.这时候小A做完啦.小B把小A的卷子.copy过来用了几分钟.做了一些修改,可能比小A的分数还要高.这个就是原型模式 所以我们在创建对象的时候比较耗时.我们在创建一个的时候就可以用原型模式. 浅克隆 只负责克隆按值传递的数据(比如基本数据类型.String

设计模式学习04—建造者模式

一.动机与定义 创建对象时,我们知道可以使用工厂方式来创建,使调用者和具体实现解耦,但是有一种情况,当要创建的多个对象之间重复性较大,只有创建步骤.组装顺序或者内部构件不同时,工厂模式就需要进一步的演化了,如我们去KFC,有很多种套餐,比如套餐1(薯条+可乐+汉堡),套餐2(鸡肉卷+薯条+可乐),这个套餐就是我们要获取的复杂对象,那么程序如何创建出这种对象呢. 我们看到套餐的内容很多是一样的,那么我们是不是可以考虑将创建单个食品(如鸡肉卷.可乐等)方法提取出来,使用单独一个类协调这些食品的组合比

设计模式三—抽象工厂模式

设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是园丁2的杰作 1.Fruit.java public interface Fruit { /* * 生长 * 收获 * 栽种 */ public void grow(); public void harvest(); public void plant(); } 2.Apple.java publi

Java设计模式学习笔记,三:建造者模式

建造者模式:实现了构建和装配的解耦,即对象的各个子组件单独构建,再进行装配,从而建造完整对象. 该模式适用于构建较为复杂的对象(多个子组件). 不同的构建者,使用相同的装配者,可以建造不同的对象实例.相同的构建者,不同的装配顺序,也可能建造出不同的对象实例. 举例: 汽车对象,子组件包括引擎.轮子和车体. Audi汽车构建者,负责制造Audi牌各个子组件.BMW汽车构建者,负责制造BMW牌各个子组件.然后将子组件统一送至汽车装配者的生产线中进行组装,最后会建造出Audi牌汽车和BMW汽车. 以下

设计模式(三)建造者模式Builder(创建型)

1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定. 例子1:买肯德基 典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡.炸鸡.可乐和玩具车).这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的. 客户端:顾客,想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择.       指

【转】设计模式(三)建造者模式Builder(创建型)

(http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对象由一定各个部分的子对象用一定的算法构成,由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但将它们组合在一起的算法相对稳定. 例子1:买肯德基 典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡.炸鸡.可乐和玩具车).这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的.   

设计模式(三)建造者模式(创建型)

定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 使用场景: 创建的产品有复杂的内部结构,且创建的产品有较多的共同点,其组成部分相似.隔离复杂对象的创建,使得相同的过程可以创建不同的产品. 与抽象工厂的区别: 在建造者模式里,有个指导者,由指导者来管理创造者,用户是与指导者联系的,指导者联系创建者得到最后的产品. 角色: Builder:一个抽象接口,用于规范定义复杂对象的组成部分. ConcreteBuilder:实现Builder接口,具体化复杂对象的各个部

创建型设计模式(三)建造者模式

一.一句话背景 假如我去麦当劳,麦当劳提供了多种多样的套餐供我选择,但是套餐组成无非就是汉堡.鸡翅.冷饮.薯条等这几种固定的东西,搭配不同就变成了不同的套餐,那么菜单的生成就可以使用建造者模式来进行 二.使用场景 基础组件不变,组合逻辑多变的场景. 如:套餐搭配 三.模型分析 菜单:类,把不同的对象组装起来,形成不同的套餐,应对不同的客户需求(套餐列表) 套餐属性:接口,定义套餐具体特征(套餐名字,包装方式,价格等) 套餐组成:抽象类,实现了套餐公有的属性方法(汉堡.饮料等广泛的内容) 套餐具体

设计模式学习笔记-建造者模式

一.概述 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示: 二.模式中的角色 Builder:为创建一个Product对象的各个部件指定抽象接口: ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件:定义并明确它所创建的表示:提供一个检索产品的接口: Director:构造一个使用Builder接口的对象: Product:表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程:包含定义组成部件的类,