牙雅   发表于 2020-1-21 23:05:41 |栏目:





JAVA24种模式-------builder模式``
       刚学java一个学期就被导师要求了解java24种设计模式,明明练习都没有两年半啊。希望我能在写博客的时候能慢慢学会builder模式。第一次用markdown,排版不好的地方以及对我写的内容有不同理解的欢迎指出、留言、私信。:)废话不多说,下面就来了解builder模式吧。

       在看了好几篇关于builder模式的博客后以及阅读了《图解设计模式》之后,对于该模式我的理解是,由于我们很难或者说将一个复杂事物一气呵成,即通过一个class就构建完这个事物的算法逻辑,我们可以将复杂事物的组成先构建出来,再拼接成这个事物,因此使得复杂对象的构建与其表示分离。同时,由于这种自下而上的构建方法使上级类不需要知道下级类使如何实现目标的,从而大大降低了代码的耦合性,能够重复在不同场合调用。

此处引用《图解设计模式》上的例子。
我们要输入一批文字,但是我们希望能有多种输入的方式,例如文档输入或者HTML输入。
//首先我们确定了要输入的文本内容。同时,由于采用了Builder模式
class Director{
        private Builder builder;
        public Director(Builder builder) {//抽象类无法创建实例对象,所以此处传递的是其子类创建的对象
                this.builder = builder; //通过这种方法实现了不同的功能
        }
        public void construct() {   //我要写进为文档的内容,但是写入的方式不同
                builder.makeTitle("Greeting");//写入的方式有传进构造器的builder类型决定。此处实现了数值域与方法操作的分离
                builder.makeString("从早上到下午");
                builder.makeItems(new String[] {
                                "晚上好","晚安","再见"
                });
                builder.close();
        }
}
123456789101112131415
abstract class Builder{    //由于我们要能够实现各种各样的同一类型但是不同种类的表示方法,所以定义一个抽象类来规定各种类型表示方法所要实现的具体方法
        public abstract void makeTitle(String title);
        public abstract void makeString(String str);
        public abstract void makeItems(String[] items);
        public abstract void close();
}
123456
class TextBuilder extends Builder{  //具体实现的方法之一:文档输入
        private StringBuffer buffer = new StringBuffer();//文档内容保存在该字段
       
        public void makeTitle(String title) {
                buffer.append("==================\n");
                buffer.append("[" + title + "]");
                buffer.append("\n");
        }
        public void makeString(String str) {
                buffer.append('#'+str+"\n");
                buffer.append("\n");
        }
        public void makeItems(String[] items) {
                for(int i = 0; i < items.length; i++) {
                        buffer.append("   " + items + "\n");
                }
        }
        public void close() {
                buffer.append("==================\n");
        }
        public String getResult() {
                return buffer.toString();//将StringBuffer变为String
        }
}

class HTMLBuilder extends Builder{//具体实现的方法之一:HTML输入
        。。。。。。
}
12345678910111213141516171819202122232425262728
Builder模式的运行从Main种可以看出
public static void main(String[] args) {
                // TODO Auto-generated method stub
                TextBuilder textbuilder = new TextBuilder();//选择所想要的表示方法
                Director director = new Director(textbuilder);在“机器”种确定该表示方法
                director.construct();//将已知数据传入到能实现这个表示方法的机器中
                String result = textbuilder.getResult();
                System.out.println(result);
        }
12345678
于是我们可以总结一下如何通过Builder模式来创建一个复杂的物体。

       这是由于Builder模式设计的各种表示方法具有其共通性,所以需要一个用于定义实例所要实现的方法的抽象类。其好处在于我们不需要在具体使用的时候在调用的类(代码中的Director类)里创建对应的构造器。

       负责实现抽象实现者的接口的类。描述了在生成实例的时候如何具体实现方法,因此决定了生成最终结果的方法。

       负责使用抽象实现者的接口来生成实例,因此它并不依赖于具体实现者。也可以将他看作一个传递数据到具体表示方法的中间媒介,它组装了各种功能。

       使用Builder模式是为了创建一个对象,所以最终实现的结果要是一个具体对象。在Builder模式中发生变化的是具体表达方式,不变的是各种表达方式的组合方法以及表达方式的具体要求。
       Builder模式的优点在于其代码清晰,易维护,易扩展;将构造和表示分离,降低耦合。

回复 显示全部楼层 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作者相关信息

更多资源

精品推荐

极品资源

原创模板

下载排行

热门标签

快速回复 返回顶部 返回列表