• 创建型设计模式之建造者模式


    建造者模式与工厂模式的最大区别是,建造者模式更关注产品的组合方式和装配顺序,而工厂模式更关注产品的生产。

    以生产电脑为类,电脑包括CPU,Memory,Disk等生产过程

    具体实现如下:

    1、定义需要生产的产品Computer

    /**
     * 定义需要生产的产品Computer
     */
    public class Computer {
        private String cpu;
        private String memory;
        private String disk;
    
        public String getCpu() {
            return cpu;
        }
    
        public void setCpu(String cpu) {
            this.cpu = cpu;
        }
    
        public String getMemory() {
            return memory;
        }
    
        public void setMemory(String memory) {
            this.memory = memory;
        }
    
        public String getDisk() {
            return disk;
        }
    
        public void setDisk(String disk) {
            this.disk = disk;
        }
    }

    2、定义抽象接口ComputerBuilder描述产品构造和装配过程:

    /**
     * 定义抽象接口Computer来描述产品构造和装配过程
     */
    public interface ComputerBuilder {
        //组装CPU
        void buildCpu();
        //组装内存的方法
        void buildMemory();
        //组装磁盘
        void buildDisk();
        //以上组装完成后,就可以调用buildComputer()组装一台完整的电脑了
        Computer buildComputer();
    }

    3、定义ComputerBuilder接口实现类

    public class ComputerBuilderImpl implements ComputerBuilder {
        Computer computer;
        public ComputerBuilderImpl(){
            computer = new Computer();
        }
        @Override
        public void buildCpu() {
            System.out.println("build cpu");
            computer.setCpu("8 core");
        }
    
        @Override
        public void buildMemory() {
            System.out.println("build memory");
            computer.setMemory("32G");
        }
    
        @Override
        public void buildDisk() {
            System.out.println("build disk");
            computer.setDisk("1024 GB");
        }
    
        @Override
        public Computer buildComputer() {
            return computer;
        }
    }

    4、定义ComputerDirector使用Builder接口实现产品的装配,该类是建造者模式对产品生产过程的封装,在需求化变时,如需更改装配顺序,调整这个类即可。

    /**
     * 定义ComputerDirector使用Builder接口实现产口的装配
     * 该类是建造者模式对产品生产的过程的封装,在需求变化时,如需先装磁盘再装CPU,只需调整Director的执行顺序即可,每个组件的装配都稳定不变。
     */
    public class ComputerDirector {
        public Computer constructComputer(ComputerBuilder computerBuilder){
            computerBuilder.buildCpu();
            computerBuilder.buildMemory();
            computerBuilder.buildDisk();
            return computerBuilder.buildComputer();
        }
    }

    5、构建Computer

    /**
     * 构建Computer
     * 定义一个ComputerDirector和ComputerBuilder为构建Computer做准备
     * 然后通过ComputerDirector的constructComputer()实现Computer的构建
     * 构建者在JDK中的应用:StringBuilder
     */
    public class Main {
        public static void main(String[] args) {
            ComputerDirector computerDirector = new ComputerDirector();
            ComputerBuilder computerBuilder = new ComputerBuilderImpl();
            Computer computer = computerDirector.constructComputer(computerBuilder);
            System.out.println(computer.getCpu());
            System.out.println(computer.getMemory());
            System.out.println(computer.getDisk());
            StringBuilder sbBuilderPattern = new StringBuilder();
        }
    }

    7、建造者模式在JDK中的应用StringBuilder

    StringBuilder源码解析

    StringBuilder sbBuilderPattern = new StringBuilder();
    
    public final class StringBuilder
        extends AbstractStringBuilder
    
    abstract class AbstractStringBuilder implements Appendable, CharSequence {
        /**
         * The value is used for character storage.
         */
        char[] value;
    
    public interface Appendable {
         Appendable append(CharSequence csq) throws IOException;
         Appendable append(CharSequence csq, int start, int end) throws IOException;
         Appendable append(char c) throws IOException;
    }

    分析:

    Appendable 接口定义了多个append方法,即Appendable为抽象建造者
    AbstractStringBuilder 实现了 Appendable 接口方法,这里 AbstractStringBuilder 已经是建造者,只是还不能实例化
    StringBuilder 即充当了指挥者角色,也充当了具体的建造者,建造方法的实现由 AbstractStringBuilder 完成,而StringBuilder继承了AbstractStringBuilder
     
  • 相关阅读:
    java线程实现和集合类综合问题
    软件体系结构风格总结
    java如何实现对象的克隆
    24小时实现盲打(程序员快速入门)
    测试面向对象软件时,设计集成测试用例的方法
    对白盒测试的一些理解
    对于工程建模需要画的图的分析及体会
    在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?
    谭静第一周任务
    陈林艳第一周任务
  • 原文地址:https://www.cnblogs.com/huangzhen22/p/14489571.html
Copyright © 2020-2023  润新知