设计模式 | 建造者模式/生成器模式(builder)

定义:

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

结构:(书中图,侵删)

一个产品类

一个指定产品各个部件的抽象创建接口

若干个实现了各个部件的具体实现的创建类

一个指挥者,用于控制具体的创建过程,包含一个抽象创建接口的引用

实例:

书中使用了游戏中创建人物的例子,人都有头、四肢、躯干这些固定组成部分,但是高矮胖瘦各不相同。

我瞬间就想到了捏脸系统,虽然说捏脸系统把人物的各种细节都交给了用户设置,细节到嘴唇的弧度都可以用户调节。

但实际上创建过程还是固定不变的,用户只需要将调整好的参数发送给系统,并不需要知道系统创建时是先“安”的头,还是先“安”的脚。

出于尽量不和书中举一样的例子,充分活跃大脑,举一反三的目的,我还得再想个别的例子。(其实还是没有跳脱出去,说到底既然是建造者模式就是造东西,想了半天也都是在想能造个什么其他的东西当例子。)

那就组装个电脑吧。

台式机一般都有主机、显示器、键盘、鼠标。

电脑类(产品类):

package designpattern.builder;

public class Computer {
    public String computerCase;
    public String monitor;
    public String keyboard;
    public String mouse;

    public String getComputerCase() {
        return computerCase;
    }

    public void setComputerCase(String computerCase) {
        this.computerCase = computerCase;
    }

    public String getMonitor() {
        return monitor;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public String getKeyboard() {
        return keyboard;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public String getMouse() {
        return mouse;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    @Override
    public String toString() {
        return "Computer [computerCase=" + computerCase + ", monitor=" + monitor + ", keyboard=" + keyboard + ", mouse="
                + mouse + "]";
    }

}

抽象建造者接口:

package designpattern.builder;

public interface ComputerBuilder {
    void assembleComputerCase(Computer computer);// 组装主机

    void assembleMonitor(Computer computer);// 组装显示器

    void assembleKeyboard(Computer computer);// 组装键盘

    void assembleMouse(Computer computer);// 组装显示器
}

具体建造者类:

游戏型电脑建造者类:

package designpattern.builder;

public class GameComputerBuilder implements ComputerBuilder {
    @Override
    public void assembleComputerCase(Computer computer) {
        computer.setComputerCase("水冷机箱");
    }

    @Override
    public void assembleMonitor(Computer computer) {
        computer.setMonitor("4k显示器");
    }

    @Override
    public void assembleKeyboard(Computer computer) {
        computer.setKeyboard("机械键盘");
    }

    @Override
    public void assembleMouse(Computer computer) {
        computer.setMouse("人体工学鼠标");
    }

}

娱乐型电脑建造者类:

package designpattern.builder;

public class AmusementComputerBuilder implements ComputerBuilder {

    @Override
    public void assembleComputerCase(Computer computer) {
        computer.setComputerCase("普通机箱");
    }

    @Override
    public void assembleMonitor(Computer computer) {
        computer.setMonitor("普通显示器");
    }

    @Override
    public void assembleKeyboard(Computer computer) {
        computer.setKeyboard("普通键盘");
    }

    @Override
    public void assembleMouse(Computer computer) {
        computer.setMouse("普通鼠标");
    }

}

指挥者类:

package designpattern.builder;

public class ComputerBuilderDirect {

    public void assembleComputer(ComputerBuilder computerBuilder, Computer computer) {
        computerBuilder.assembleComputerCase(computer);
        computerBuilder.assembleMonitor(computer);
        computerBuilder.assembleKeyboard(computer);
        computerBuilder.assembleMouse(computer);
    }

    // 或者写成下面这样?可能具体情况具体分析吧

    public Computer assembleComputer(ComputerBuilder computerBuilder) {
        Computer computer = new Computer();
        computerBuilder.assembleComputerCase(computer);
        computerBuilder.assembleMonitor(computer);
        computerBuilder.assembleKeyboard(computer);
        computerBuilder.assembleMouse(computer);
        return computer;
    }
}

客户端:

package designpattern.builder;

public class Client {
    public static void main(String[] args) {
        ComputerBuilderDirect computerBuilderDirect = new ComputerBuilderDirect();
        // 组装游戏型电脑
        Computer gameComputer = new Computer();
        computerBuilderDirect.assembleComputer(new GameComputerBuilder(), gameComputer);
        System.out.println("游戏型电脑:");
        System.out.println(gameComputer);
        // 组装普通娱乐型电脑
        Computer assembleComputer = new Computer();
        computerBuilderDirect.assembleComputer(new AmusementComputerBuilder(), assembleComputer);
        System.out.println("普通娱乐型电脑:");
        System.out.println(assembleComputer);
    }
}

结果输出:

游戏型电脑:
Computer [computerCase=水冷机箱, monitor=4k显示器, keyboard=机械键盘, mouse=人体工学鼠标]
普通娱乐型电脑:
Computer [computerCase=普通机箱, monitor=普通显示器, keyboard=普通键盘, mouse=普通鼠标]

总结:

这个设计模式在一个大体构建过程一致,构建过程的具体细节不同的对象创建时,可以使用。

首先是可以保证同类对象的构建过程一致,其次是分离客户端和具体实现,同样满足迪米特/最少知识法则。

原文地址:https://www.cnblogs.com/imoqian/p/10727296.html

时间: 2024-08-30 00:46:56

设计模式 | 建造者模式/生成器模式(builder)的相关文章

设计模式——建造者模式/生成器模式(C++实现)

1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class STProduct 7 { 8 public: 9 void setA(string str) 10 { 11 m_a = str; 12 } 13 14 void setB(string str) 15 { 16 m_b = str; 17 } 18 19 void setC(string str) 20 { 21 m_c =

设计模式系列之生成器模式

builder模式主要用于创建复杂对象,着重于复杂对象的内部构建.通过将构建过程与表示分离,同一个构建过程可以生产不同的外部表示.builder模式由导向器和生成器构成,导向器负责构建过程,生成器负责生产对象的外部表示.导向器包含有一个生成器,当需要更换对象表示时,只需要换一个生成器即可. 上篇文章设计芯片设计软件时,abstract factory更加着重于支持创造多个掩模系列上图形的功能.现在我们换一个重点,现在给出一个掩模上所有图形的信息,这个信息可以存储在格式化文件比如xml文件中,为了

设计模式系列之五-生成器模式

参考资料: 建造者模式

设计模式之创建型模式

一.前言 设计模式应该是在软件工程的背景下进行讨论的,而不是为了设计模式而论设计模式.设计模式是软件工程面向对象设计工作中一个抽象.归纳.总结的过程.软件设计的最高目标和最高准则就是易扩展,易复用,易维护, 灵活性高,高可用,稳定性高一切的设计原则和设计模式最终的目标都是向这个目标靠拢的. 二.面向对象设计六大原则 任何的设计模式都是基于面向对象的特性(抽象.封装.继承.多态)和设计原则进行设计和实现的,是面向对象设计原则的在不同场景下的实现方案. 抽象:抽离变化的部分,引入抽象层,实现具体实现

跟着实例学习设计模式-生成器模式(builder)

生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得相同的构建过程能够得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者,为创建一个Vehicle对象并创建它的相关部件指定的抽象接口,把产品的生产过程分解为不同的步骤,从而使具体的建造者在具体的建造步骤上具有更多弹性,从而创造出不同表示的产品.(这里就是小车和卡车) CarBuilder.TrunkBuilder:具体建造者,实现IVehicleBuilder接口,构造和装配产品的各个部件定义并明确

设计模式(二): BUILDER生成器模式 -- 创建型模式

1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2. 当构造过程必须允许被构造的对象有不同表示时. 3.评价 1. 它使你可以改变一个产品的内部表示. Builder对象提供给导向器一个构造产品的抽象接口.该接口使得生成器可以隐藏这个产品的表示和内部结构.它同时也隐藏了该产品是如何装配的.因为产品是通过抽象接口构造的,你在改变该产品的内部表

设计模式—建造者模式(Builder)

title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对象创建型模式.我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来.建造者模式又可以称为生成器模式. 模式结构 一个标准的建造者模式包含如下角色: Builder:抽象建造者 ConcreteBuilder:具体建造者 Director

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

深入浅出设计模式——建造者模式(Builder Pattern)

模式动机无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮.方向盘.发送机等各种部件.而对于大多数用户而言,无须知道这些部件的装配细节,也几乎不会使用单独某个部件,而是使用一辆完整的汽车,可以通过建造者模式对其进行设计与描述,建造者模式可以将部件和其组装过程分开,一步一步创建一个复杂的对象.用户只需要指定复杂对象的类型就可以得到该对象,而无须知道其内部的具体构造细节. 在软件开发中,也存在大量类似汽车一样的复杂对象,它们拥有一系列成员属性,这些成员