zoukankan      html  css  js  c++  java
  • 设计模式 | 建造者模式/生成器模式(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=普通鼠标]

    总结:

    这个设计模式在一个大体构建过程一致,构建过程的具体细节不同的对象创建时,可以使用。
    首先是可以保证同类对象的构建过程一致,其次是分离客户端和具体实现,同样满足迪米特/最少知识法则。
     
  • 相关阅读:
    vue-cli中安装方法
    css初始化
    VUE基本指令(v-model,v-html,v-text,v-bind,v-if,v-show,v-for,v-on:click,组件,过滤器)
    在浏览器上安装 Vue Devtools工具
    vue前端框架面试问题汇总
    git修改用户名、邮箱
    js对字符串的一些操作方法
    11款JavaScript颜色拾取插件推荐
    vue-devtools的安装与使用
    JS里的居民们4-数组((堆)队列
  • 原文地址:https://www.cnblogs.com/imoqian/p/10727296.html
Copyright © 2011-2022 走看看