• 设计模式之——Builder建造模式


    Builder模式又叫建造模式,是用于组装具有复杂结构的实例的模式。

    示例程序是编写一个文档,并且写入到文件中,该文档具有以下结构,含有标题,字符串,一些条目。

    • Builder抽象类,为建造模式的核心
    package site.wangxin520.gof.builder;
    
    /**
     * 建造者模式的核心——建造者
     * 负责定义用于生成实例的API接口
     * @author wangXgnaw
     * 在本类中,定义了四个方法,分别是标题,字符串和条目,最后的close()方法则用于生成文件以及关闭相应的流
     */
    public abstract class Builder {
    
        /**
         * 抽象方法,传入字符串标题,用于生成文件的字符串
         * @param title
         */
        public abstract void makeTitle(String title);
        
        /**
         * 抽象方法,传入字符串
         * @param string
         */
        public abstract void makeString(String string);
        
        /**
         * 抽象方法,用于传入一个字符串数组,生成文件中对应的条目
         * @param items
         */
        public abstract void makeItems(String[] items);
        
        /**
         * 抽象方法,关闭相应的流
         */
        public abstract void close();
        
    }
    • Director 监工类,调用builder的方法
    package site.wangxin520.gof.builder;
    
    /**
     * 管理者,监工
     * 负责使用builder角色的接口来生成实例,它并不依赖于具体实现类,而是面对抽象类/父类,或者接口进行操作
     * @author wangXgnaw
     * 在本类汇总有一个Builder的属性。
     * 采用的是多态的方法,父类接口指向子类对象
     */
    public class Director {
    
        private Builder builder;
        
        /**
         * 构造器传入Builder属性的具体实现
         * @param builder
         */
        public Director(Builder builder){
            this.builder=builder;
        }
        
        /**
         * 生成文档的方法
         */
        public void construct(){
            
            builder.makeTitle("标题:大家好");
            builder.makeString("从早上到下午");
            builder.makeItems(new String[]{
                    "早安",
                    "午安",
            });
            builder.makeString("晚上");
            builder.makeItems(new String[]{
                    "晚安",
                    "拜拜",
            });
            builder.close();
            
        }
        
    }
    • HtmlBuilder 继承了Builder类,实现了相应的方法
    package site.wangxin520.gof.builder;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * 生成HTML文件的建造模式,对Builder抽象类的具体实现
     * @author wangXgnaw
     *
     */
    public class HtmlBuilder extends Builder{
    
        private StringBuilder sb=new StringBuilder();
        
        @Override
        public void makeTitle(String title) {
            sb.append("<html>").append("<head><title>").append(title).append("</title></head><body>");
        }
    
        @Override
        public void makeString(String string) {
            sb.append("<p>").append(string).append("</p>");
        }
    
        @Override
        public void makeItems(String[] items) {
            sb.append("<ul>");
            for (String string : items) {
                sb.append("<li>").append(string).append("</li>");
            }
            sb.append("</ul>");
        }
    
        @Override
        public void close() {
            sb.append("</body></html>");
            FileWriter fw=null;
            try {
                fw=new FileWriter(new File("E:/TextBuilder.html"));
                fw.write(sb.toString());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(fw!=null){
                    try {
                        fw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
    }
    • TextBuilder同上
    package site.wangxin520.gof.builder;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * 生成txt文件的建造模式,对Builder抽象类的具体实现
     * 
     * @author wangXgnaw
     *
     */
    public class TextBuilder extends Builder {
    
        private StringBuilder sb = new StringBuilder();
    
        @Override
        public void makeTitle(String title) {
            sb.append("========================================").append("
    ");
            sb.append("【" + title + "】").append("
    ");
            sb.append("========================================").append("
    ").append("
    ");
        }
    
        @Override
        public void makeString(String string) {
            sb.append("【.】" + string).append("
    ").append("
    ");
        }
    
        @Override
        public void makeItems(String[] items) {
            for (String string : items) {
                sb.append("	" + string).append("
    ");
            }
            sb.append("
    ");
        }
    
        @Override
        public void close() {
            sb.append("========================================");
            FileWriter fw = null;
            try {
                fw = new FileWriter(new File("E:/TextBuilder.txt"));
                fw.write(sb.toString());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (fw != null) {
                    try {
                        fw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
    }
    • Main,测试类
    package site.wangxin520.gof.builder;
    
    /**
     * 建造者模式的测试类
     * @author wangXgnaw
     *
     */
    public class Main {
    
        public static void main(String[] args) {
            
            //先构建一个Builder,采用的是TextBuilder的实现类
            Builder b1=new TextBuilder();
            //将Builder实例传入到Director中
            Director director1=new Director(b1);
            //调用构造方法,生成文档
            director1.construct();
            
            //与上同
            Builder b2=new HtmlBuilder();
            Director director2=new Director(b2);
            director2.construct();
            
            
        }
    
    }
    • 测试结果:

    没有报错,并且成功的在E盘中写入俩文件

    image

    TextBuilder.txt

    image

    TextBuilder.html(这里忘记改名字了)

    image

  • 相关阅读:
    关于sqrt函数的使用
    电子商务
    随笔
    哈哈
    整体管理
    软件产品质量特性
    问题
    风险
    antd
    Flex布局大作用
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7639504.html
Copyright © 2020-2023  润新知