builder 设计模式

1、经典的Builder模式

Product

/**
 * 计算机抽象类, 即Product角色
 */
public abstract class Computer {

    protected String mBoard;
    protected String mDisplay;
    protected String mOS;

    public Computer() {
    }

    public void setBoard(String board) {
        mBoard = board;
    }

    public void setDisplay(String display) {
        mDisplay = display;
    }

    public abstract void setOS();

    @Override
    public String toString() {
        return "Computer{"
                + "mBoard=‘"
                + mBoard
                + ‘\‘‘
                + ", mDisplay=‘"
                + mDisplay
                + ‘\‘‘
                + ", mOS=‘"
                + mOS
                + ‘\‘‘
                + ‘}‘;
    }
}
复制代码

作者:mundane
链接:https://juejin.im/post/5aa3dfd66fb9a028c42dd13a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

具体的Product

/**
 * 具体的Computer类
 */
public class Macbook extends Computer {

    public Macbook() {
    }

    @Override
    public void setOS() {
        mOS = "Mac OS X 10.10";
    }
}

作者:mundane
链接:https://juejin.im/post/5aa3dfd66fb9a028c42dd13a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

抽象Builder

/**
 * 抽象Builder类
 */
public abstract class Builder {

    public abstract void buildBoard(String board);

    public abstract void buildDisplay(String display);

    public abstract void buildOS();

    public abstract Computer create();

}

作者:mundane
链接:https://juejin.im/post/5aa3dfd66fb9a028c42dd13a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ConcreteBuilder

/**
 * 具体的Builder类, MacbookBuilder
 */
public class MacbookBuilder extends Builder {
    private Computer mComputer = new Macbook();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildDisplay(String display) {
        mComputer.setDisplay(display);
    }

    @Override
    public void buildOS() {
        mComputer.setOS();
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}
复制代码

作者:mundane
链接:https://juejin.im/post/5aa3dfd66fb9a028c42dd13a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

/**
 * Director类, 负责构造Computer
 */
public class Director {

    Builder mBuilder;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    public void construct(String board, String display) {
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOS();
    }
}

作者:mundane
链接:https://juejin.im/post/5aa3dfd66fb9a028c42dd13a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
public class Main {

    public static void main(String[] args) {
        Builder builder = new MacbookBuilder();
        Director pcDirector = new Director(builder);
        pcDirector.construct("英特尔主板", "Retina 显示器");
        Computer macBook = builder.create();
        System.out.println("Computer Info: " + macBook.toString());
    }
}

作者:mundane
链接:https://juejin.im/post/5aa3dfd66fb9a028c42dd13a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

输出结果:

Computer Info: Computer{mBoard=‘英特尔主板‘, mDisplay=‘Retina 显示器‘, mOS=‘Mac OS X 10.10‘}

可以看出, 经典的 Builder 模式重点在于抽象出对象创建的步骤,并通过调用不同的具体实现类从而得到不同的结果, 但是在创建过程中依然要传入多个参数, 不是很方便, 所以有了变种的Builder模式

2、变种的Builder模式

public class User {

    private final String firstName;     // 必传参数
    private final String lastName;      // 必传参数
    private final int age;              // 可选参数
    private final String phone;         // 可选参数
    private final String address;       // 可选参数

    private User(UserBuilder builder) {
        this.firstName = builder.firstName;
        this.lastName = builder.lastName;
        this.age = builder.age;
        this.phone = builder.phone;
        this.address = builder.address;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }

    public String getAddress() {
        return address;
    }

    public static class UserBuilder {
        private final String firstName;
        private final String lastName;
        private int age;
        private String phone;
        private String address;

        public UserBuilder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}
使用new User.UserBuilder("王", "小二")
                .age(20)
                .phone("123456789")
                .address("亚特兰蒂斯大陆")
                .build();

唯一可能存在的问题就是会产生多余的Builder对象,消耗内存。然而大多数情况下我们的Builder内部类使用的是静态修饰的(static),所以这个问题也没多大关系。

由于Builder是非线程安全的,所以如果要在Builder内部类中检查一个参数的合法性,必需要在对象创建完成之后再检查。

public User build() {
  User user = new user(this);
  if (user.getAge() > 120) {
    throw new IllegalStateException(“Age out of range”); // 线程安全
  }
  return user;
}

上面的写法是正确的,而下面的代码是非线程安全的:

public User build() {
  if (age > 120) {
    throw new IllegalStateException(“Age out of range”); // 非线程安全
  }
  return new User(this);
}

原文地址:https://www.cnblogs.com/LittleSpring/p/11417463.html

时间: 2024-08-06 14:50:28

builder 设计模式的相关文章

Builder设计模式

Builder设计模式:个人认为,核心在于两个类.Builder类和Director类.通过Builder类和Director类,把万事万物抽象为部件和组装两部分.通过两部分的配合,把最终的产品,展示给客户.上图,只组装了一款产品. 公司做大以后,不仅可以提供一款产品.根据已有的功能多少和精简,可以快速生产出多种的产品,只要不同的construct和Product就可以了.construct提供了三个功能,说明这是一款lenovo的thinkpadT430笔记本电脑.如果construct只提供

建造者(Builder)设计模式

建造者(Builder)设计模式 1.0.0 产生建造者模式的原因 ????在类的数据特别复杂的时候,创建一个类需要花费很长的时间,因为有些类需要根据不同的场合进行不同的初始化.在类结构比较复杂,而且初始化比较困难的情况下,封装好的类创建步骤可以减少工作量,提高稳定性.这就是为什么需要建造者模式的原因. 2.0.0 什么是建造者模式? 将复杂对象的构建和对象的表示分离,使得同样的构建过程可以创建不同的表示. 3.0.0 建造模式的使用场景 复杂对象的创建(参数较多,而且比较初始化困难)--->创

Builder 设计模式的学习

Buileder(生成器)-对象创建型模式 一 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二 适用性 在以下情况使用Build模式: 1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2 当构造过程必须允许被构造的对象有不同的表示时. 3 Builder模式要解决的也正是这样的问题: 当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成), 我们要复杂对象的创建过程和这个对象的表示(展示)分离开来, 这样做的好处就是通过一

[DesignPattern]Builder设计模式

模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时: 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适: Android源码中的模式实现 在Android源码中,我们最常用到的Builder模式就是AlertDialog.Builder, 使用该Builder来构建复杂的AlertD

深入浅出设计模式 ------ Builder(生成器模式)

一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构  三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件.定义并明确它所创建的表示.提供一个检索产品的接口. Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象.如下文代码ChefDirector类. Product : 表示被构造的复杂对

深入浅出设计模式 ------ Builder(生成器)

一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构  三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件.定义并明确它所创建的表示.提供一个检索产品的接口. Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象.如下文代码ChefDirector类. Product : 表示被构造的复杂对

iOS设计模式FWZ

1.单例模式 2.Builder设计模式 4.原型模式 5.工厂方法模式 6.状态模式 7.解释器模式 8.责任编辑模式 9.命令模式 10.观察者模式 KVO 11.备忘录模式 12.迭代器模式 13.模板方法模式 14.访问者模式

建造者设计模式

建造者设计模式 内容列表: 建造者模式 建造者模式实现 示例代码 使用 jdk中的应用 建造者模式 和工厂.抽象工厂设计模式一样,builder设计模式也是对象创建类型中的一种.当创建的对象比较复杂的时候,特别是包含的属性比较多,工厂方法创建此类对象是比较麻烦的,builder是为了解决这类问题而引入的. 工厂方法创建此类对象时主要有以下几类问题需要解决: 当有很多参数的时候,特别是当这些参数比较多的时候,client在调用工厂类创建对象的时候很容易出错. 其中传递的参数,有些是必须要传递的,而

Android - 设计模式

从Android代码中来记忆23种设计模式 1 单例模式 单例模式可以说是最容易理解的模式了,也是应用最广的模式之一,先看看定义吧. 定义:确保单例类只有一个实例,并且这个单例类提供一个函数接口让其他类获取到这个唯一的实例. 什么时候需要使用单例模式呢:如果某个类,创建时需要消耗很多资源,即new出这个类的代价很大:或者是这个类占用很多内存,如果创建太多这个类实例会导致内存占用太多. 关于单例模式,虽然很简单,无需过多的解释,但是这里还要提个醒,其实单例模式里面有很多坑.我们去会会单例模式.最简