建造者模式

建造者模式

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
建造者模式像是使用多个“小型”工厂来最终创建出一个完整对象。

解决

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

优点

  • 在建造者模式中, 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
  • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象
  • 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
  • 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”

缺点

  • 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

结构

建造者模式包含如下角色:

  • Builder:抽象建造者
  • ConcreteBuilder:具体建造者
  • Director:指挥者
  • Product:产品角色
    在这里插入图片描述

实现

package buildermethod;

/**
 * 抽象建造者类确定产品由两个部件组成,并声明一个得到产品建造后结果的方法GetResult
 */
public abstract class Builder {
    public abstract void buildPartA();
    public abstract void buildPartB();
    public abstract Product getResult();
}
package buildermethod;
/**
 * 具体建造者类
 * 建造 A B
 */
public class ConcreteBuilder1 extends Builder {

    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("部件A");
    }

    @Override
    public void buildPartB() {
        product.add("部件B");
    }

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

}
package buildermethod;

/**
 * 具体建造者类
 * 建造 X Y
 */
public class ConcreteBuilder2 extends Builder {
    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.add("部件X");
    }

    @Override
    public void buildPartB() {
        product.add("部件Y");
    }

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

/**
 * 指挥者类,用来指挥建造过程
 */
public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}
package buildermethod;

import java.util.ArrayList;
import java.util.List;

/**
 * 产品类,由多个部件组成
 */
public class Product {
    List<String> parts = new ArrayList<String>();

    // 添加产品部件
    public void add(String part) {
        parts.add(part);
    }

    // 列举所有的产品部件
    public void show() {
        System.out.println("---产品 创建---");

        for (String part : parts) {
            System.out.println(part);
        }
    }
}
package buildermethod;

/**
 * 客户不必知道具体的建造过程
 */
public class BuilderClient {
    public static void main(String[] args) {
        Director director = new Director();
        Builder b1 = new ConcreteBuilder1();
        Builder b2 = new ConcreteBuilder2();

        director.construct(b1);
        Product p1 = b1.getResult();
        p1.show();

        director.construct(b2);
        Product p2 = b2.getResult();
        p2.show();
    }
}

在这里插入图片描述

实例

饭店要炒面炒饭,小厨师听主厨指挥做饭

package buildermethod.demo;

import java.util.ArrayList;
import java.util.List;

/**
 * Product类
 * Lunch,由多个步骤组成
 */
public class Lunch {
    List<String> parts = new ArrayList<String>();

    // 添加步骤
    public void add(String part) {
        parts.add(part);
    }

    // 列举所有的步骤
    public void show() {
        System.out.println("---这个饭需要---");

        for (String part : parts) {
            System.out.println(part);
        }
    }
}
package buildermethod.demo;
/**
 * 抽象建造者类(Builder) 确定饭由四步组成,并声明一个得到产品建造后结果的方法GetResult
 * 声明做午饭必须4个步骤!!
 */
public abstract class Cook {
    public abstract void step1();
    public abstract void step2();
    public abstract void step3();
    public abstract void step4();

    public abstract Lunch getResult();
}
package buildermethod.demo;


/**
 * 具体建造者类
 * 炒面 主厨说了得四个步骤!
 */
public class ChaoMian extends Cook {
    private Lunch lunch = new Lunch();

    @Override
    public void step1() {
        lunch.add("加油");
    }

    @Override
    public void step2() {
        lunch.add("加菜");
    }

    @Override
    public void step3() {
        lunch.add("加面");
    }

    @Override
    public void step4() {
        lunch.add("加盐");
    }

    @Override
    public Lunch getResult() {
        return lunch;
    }
}
package buildermethod.demo;
/**
 * 具体建造者类
 * 炒饭 上面人说了得四个步骤!
 */
public class ChaoFan extends Cook {

    private Lunch lunch = new Lunch();

    @Override
    public void step1() {
        lunch.add("加油");
    }

    @Override
    public void step2() {
        lunch.add("加蛋");
    }

    @Override
    public void step3() {
        lunch.add("加米");
    }

    @Override
    public void step4() {
        lunch.add("加盐");
    }

    @Override
    public Lunch getResult() {
        return lunch;
    }
}
package buildermethod.demo;
/**
 * 指挥者类,用来指挥建造过程
 * 主厨说做饭需要4步
 */
public class HeadChef {
    public void construct(Cook cook) {
        cook.step1();
        cook.step2();
        cook.step3();
        cook.step4();
    }
}
package buildermethod.demo;
/**
 * 客户不必知道具体的建造过程
 * 顾客不用知道饭咋做的,只知道“叫”主厨,“让”厨师,做饭
 * 咱们要做炒饭和炒面,为了让小厨师“标准化”的做饭,别忘了加盐!
 */
public class BuilderClient {
    public static void main(String[] args) {
        HeadChef director = new HeadChef();
        Cook c1 = new ChaoFan();
        Cook c2 = new ChaoMian();

        director.construct(c1);
        Lunch chaofan = c1.getResult();
        chaofan.show();

        director.construct(c2);
        Lunch chaomian = c2.getResult();
        chaomian.show();
    }
}

在这里插入图片描述

总结

  • 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。
  • 建造者模式包含如下四个角色:抽象建造者为创建一个产品对象的各个部件指定抽象接口;具体建造者实现了抽象建造者接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象;产品角色是被构建的复杂对象,包含多个组成部件;指挥者负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造
  • 在建造者模式的结构中引入了一个指挥者类,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。
  • 建造者模式的主要优点在于客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,符合“开闭原则”,还可以更加精细地控制产品的创建过程;其主要缺点在于由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到一定的限制,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
  • 建造者模式适用情况包括:需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性;需要生成的产品对象的属性相互依赖,需要指定其生成顺序;对象的创建过程独立于创建该对象的类;隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同类型的产品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值