<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F</id>
	<title>设计模式：建造者模式 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F&amp;action=history"/>
	<updated>2026-05-19T10:41:50Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F&amp;diff=2930&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:设计模式  == 关于 == 建造者（Builder）模式的定义：指将一个复杂对象的构造与它的表示分离，使同样的构建过程…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%EF%BC%9A%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F&amp;diff=2930&amp;oldid=prev"/>
		<updated>2021-05-08T13:20:33Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F&quot; title=&quot;分类:设计模式&quot;&gt;category:设计模式&lt;/a&gt;  == 关于 == 建造者（Builder）模式的定义：指将一个复杂对象的构造与它的表示分离，使同样的构建过程…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:设计模式]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
建造者（Builder）模式的定义：指将一个复杂对象的构造与它的表示分离，使同样的构建过程可以创建不同的表示，这样的设计模式被称为“建造者模式”。&lt;br /&gt;
&lt;br /&gt;
它是'''将一个复杂的对象分解为多个简单的对象'''，然后一步一步构建而成。它将变与不变相分离，即产品的组成部分是不变的，但每一部分是可以灵活选择的。&lt;br /&gt;
&lt;br /&gt;
* “建造者模式”和“工厂模式”的关注点不同：建造者模式注重零部件的组装过程，而工厂方法模式更注重零部件的创建过程，但两者可以结合使用。&lt;br /&gt;
&lt;br /&gt;
=== 优点和缺点 ===&lt;br /&gt;
优点：&lt;br /&gt;
* 封装性好，构建和表示分离。&lt;br /&gt;
* 扩展性好，各个具体的建造者相互独立，有利于系统的解耦。&lt;br /&gt;
* 客户端不必知道产品内部组成的细节，建造者可以对创建过程逐步细化，而不对其它模块产生任何影响，便于控制细节风险。&lt;br /&gt;
&lt;br /&gt;
缺点&lt;br /&gt;
* '''产品的组成部分必须相同'''，这限制了其使用范围。&lt;br /&gt;
* 如果产品的内部变化复杂，'''如果产品内部发生变化，则建造者也要同步修改'''，后期维护成本较大。&lt;br /&gt;
&lt;br /&gt;
=== 与“工厂模式”的区别 ===&lt;br /&gt;
通过前面的学习，我们已经了解了建造者模式，那么它和工厂模式有什么区别呢？&lt;br /&gt;
* 建造者模式更加注重'''方法的调用顺序'''，工厂模式注重'''创建对象'''。&lt;br /&gt;
* 创建对象的力度不同，建造者模式创建复杂的对象，由各种复杂的部件组成，工厂模式创建出来的对象都一样&lt;br /&gt;
* 关注重点不一样，工厂模式只需要把对象创建出来就可以了，而建造者模式不仅要创建出对象，还要知道对象由哪些部件组成。&lt;br /&gt;
* 建造者模式根据建造过程中的顺序不一样，最终对象部件组成也不一样。&lt;br /&gt;
&lt;br /&gt;
=== 应用场景 ===&lt;br /&gt;
建造者模式唯一区别于工厂模式的是'''针对复杂对象的创建'''。也就是说，如果创建简单对象，通常都是使用工厂模式进行创建，而如果创建复杂对象，就可以考虑使用建造者模式。&lt;br /&gt;
&lt;br /&gt;
当需要创建的产品具备复杂创建过程时，可以抽取出共性创建过程，然后交由具体实现类自定义创建流程，使得同样的创建行为可以生产出不同的产品，分离了创建与表示，使创建产品的灵活性大大增加。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
建造者模式主要适用于以下应用场景：&lt;br /&gt;
* '''相同的方法，不同的执行顺序，产生不同的结果'''。&lt;br /&gt;
* 多个部件或零件，都可以装配到一个对象中，但是产生的结果又不相同。&lt;br /&gt;
* 产品类非常复杂，或者产品类中不同的调用顺序产生不同的作用。&lt;br /&gt;
* 初始化一个对象特别复杂，参数多，而且很多参数都具有默认值。&lt;br /&gt;
&lt;br /&gt;
== 结构与实现 ==&lt;br /&gt;
建造者（Builder）模式的主要角色如下：&lt;br /&gt;
# '''产品'''（Product）：它是包含多个组成部件的复杂对象，由具体建造者来创建其各个零部件。&lt;br /&gt;
# '''抽象建造者'''（Builder）：它是一个包含创建产品各个子部件的抽象方法的接口，通常还包含一个返回复杂产品的方法“getResult()”。&lt;br /&gt;
# '''具体建造者'''(Concrete Builder）：实现“Builder”接口，完成复杂产品的各个部件的具体创建方法。&lt;br /&gt;
# '''指挥者'''（Director）：它调用建造者对象中的部件构造与装配方法完成复杂对象的创建，在指挥者中不涉及具体产品的信息。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
其结构如下：&lt;br /&gt;
: [[File:设计模式：建造者模式.png|600px]]&lt;br /&gt;
&lt;br /&gt;
其代码如下：&lt;br /&gt;
# 产品：包含多个组成部件的复杂对象。&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
class Product {&lt;br /&gt;
    private String partA;&lt;br /&gt;
    private String partB;&lt;br /&gt;
    private String partC;&lt;br /&gt;
    public void setPartA(String partA) {&lt;br /&gt;
        this.partA = partA;&lt;br /&gt;
    }&lt;br /&gt;
    public void setPartB(String partB) {&lt;br /&gt;
        this.partB = partB;&lt;br /&gt;
    }&lt;br /&gt;
    public void setPartC(String partC) {&lt;br /&gt;
        this.partC = partC;&lt;br /&gt;
    }&lt;br /&gt;
    public void show() {&lt;br /&gt;
        //显示产品的特性&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 抽象建造者：包含创建产品各个子部件的抽象方法。&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
abstract class Builder {&lt;br /&gt;
    //创建产品对象&lt;br /&gt;
    protected Product product = new Product();&lt;br /&gt;
    public abstract void buildPartA();&lt;br /&gt;
    public abstract void buildPartB();&lt;br /&gt;
    public abstract void buildPartC();&lt;br /&gt;
    &lt;br /&gt;
    //返回产品对象&lt;br /&gt;
    public Product getResult() {&lt;br /&gt;
        return product;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 具体建造者：实现了抽象建造者接口。&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public class ConcreteBuilder extends Builder {&lt;br /&gt;
    public void buildPartA() {&lt;br /&gt;
        product.setPartA(&amp;quot;建造 PartA&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void buildPartB() {&lt;br /&gt;
        product.setPartB(&amp;quot;建造 PartB&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    public void buildPartC() {&lt;br /&gt;
        product.setPartC(&amp;quot;建造 PartC&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 指挥者：调用建造者中的方法完成复杂对象的创建。&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
class Director {&lt;br /&gt;
    private Builder builder;&lt;br /&gt;
    public Director(Builder builder) {&lt;br /&gt;
        this.builder = builder;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //产品构建与组装方法&lt;br /&gt;
    public Product construct() {&lt;br /&gt;
        builder.buildPartA();&lt;br /&gt;
        builder.buildPartB();&lt;br /&gt;
        builder.buildPartC();&lt;br /&gt;
        return builder.getResult();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# 客户类：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot; highlight=&amp;quot;3-5&amp;quot;&amp;gt;&lt;br /&gt;
public class Client {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        Builder builder = new ConcreteBuilder();&lt;br /&gt;
        Director director = new Director(builder);&lt;br /&gt;
        Product product = director.construct();&lt;br /&gt;
        product.show();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 模式的扩展 ==&lt;br /&gt;
建造者（Builder）模式在应用过程中可以根据需要改变，如果创建的产品种类只有一种，只需要一个具体建造者，这时可以'''省略掉抽象建造者'''，甚至可以'''省略掉指挥者'''角色。&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>