欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-08 07:52:26
定义: 定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 结构:(书中图,侵删) 一个产品类 一个指定产品各个部件的抽象创建接口 若干个实现了各个部件的具体实现的创建类 一个指挥者,用于控制具体的创建过程,包含一个抽象创建接口的引用 实例: 实例: 书中使用了游戏中 ......

定义:

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

结构:(书中图,侵删)

设计模式 | 建造者模式/生成器模式(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=普通鼠标]

总结:

这个设计模式在一个大体构建过程一致,构建过程的具体细节不同的对象创建时,可以使用。
首先是可以保证同类对象的构建过程一致,其次是分离客户端和具体实现,同样满足迪米特/最少知识法则。