当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 设计模式 | 建造者模式/生成器模式(builder)

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

2019年04月18日  | 移动技术网IT编程  | 我要评论

定义:

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

结构:(书中图,侵删)

一个产品类
一个指定产品各个部件的抽象创建接口
若干个实现了各个部件的具体实现的创建类
一个指挥者,用于控制具体的创建过程,包含一个抽象创建接口的引用
 

实例:

书中使用了游戏中创建人物的例子,人都有头、四肢、躯干这些固定组成部分,但是高矮胖瘦各不相同。
我瞬间就想到了捏脸系统,虽然说捏脸系统把人物的各种细节都交给了用户设置,细节到嘴唇的弧度都可以用户调节。
但实际上创建过程还是固定不变的,用户只需要将调整好的参数发送给系统,并不需要知道系统创建时是先“安”的头,还是先“安”的脚。
出于尽量不和书中举一样的例子,充分活跃大脑,举一反三的目的,我还得再想个别的例子。(其实还是没有跳脱出去,说到底既然是建造者模式就是造东西,想了半天也都是在想能造个什么其他的东西当例子。)
那就组装个电脑吧。
台式机一般都有主机、显示器、键盘、鼠标。
电脑类(产品类):
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=普通鼠标]

总结:

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网