03—构造器模式

1、builder模式

场景

构造一个复杂的对象,很多属性的时候,有些属性构造的时需要做一些校验或者格式转换

1-1、不使用构造器模式

public class WithoutBuilderPatternDemo {

    public static void main(String[] args) {
        //构造这个复杂的product对象
        Product product = new Product();

        //设置 field1属性
        System.out.println("在设置field1之前进行复杂的校验逻辑");
        product.setField1("值1");

        //设置 field2属性
        System.out.println("在设置field2之前进行复杂的校验逻辑");
        product.setField2("值2");

        //设置 field2属性
        System.out.println("在设置field3之前进行复杂的校验逻辑");
        product.setField2("值3");
        
        /**
         * 上面是简化的一个逻辑,实际上对于一些有几十个字段,甚至是上百个字段的复杂对象的构建
         * 上面那段代码极度膨胀,非常复杂
         * 一个是说,大量的代码堆积在一起,维护性非常差,可读性非常差,一坨代码,跟翔一样,读不懂,没法改
         * 另外一个是说,这段逻辑,如果在多个地方都有使用的话,一旦这段逻辑出现了一些变化,那么可能就需要
         * 在多个地方修改这一大坨跟屎一样的代码
         * 把不同的构造的步骤,抽取成某一个方法
         */
    }

    public static class Product{
        private String field1;
        private String field2;
        private String field3;
       // get and set ...
    }
}

1-2、使用构造器模式

public class OptimizeBuilderPatternDemo {

    public static void main(String[] args) {

        Product product = new ConcreteBuilder()
                .filed1("值1")
                .filed2("值2")
                .filed3("值3")
                .create();
        System.out.println(product);
        //现在基本上流行的一些开源框架,构造器模式的运用,一般都是上面这种变种模式
    }

    public static class Product {
        private String field1;
        private String field2;
        private String field3;
        // get and set....
    }

    public interface Builder{
        Builder filed1(String value);
        Builder filed2(String value);
        Builder filed3(String value);
        Product create();
    }

    public static class ConcreteBuilder implements Builder{

        private Product product;

        @Override
        public Builder filed1(String value) {
            System.out.println("在设置field1之前进行复杂的校验逻辑");
            product.setField1(value);
            return this;
        }

        @Override
        public Builder filed2(String value) {
            System.out.println("在设置field2之前进行复杂的数据格式转化逻辑");
            product.setField2(value);
            return this;
        }

        @Override
        public Builder filed3(String value) {
            System.out.println("在设置field3之前进行复杂的数据处理逻辑,跟其他对象的数据进行关联");
            product.setField3(value);
            return this;
        }

        @Override
        public Product create() {
            return product;
        }
    }
}

总结

构造器是一种非常棒,非常实用,非常常用的设计模式,很有必要运用到日常编码中,同时阅读开源项目源码的时候,这种模式太常见了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,108评论 18 139
  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,710评论 0 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,041评论 1 32
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 21,813评论 1 92
  • 在有关“曼生壶”的史料中并没有发现有“石瓢”的记载,曼生瓢铭文七行十四字:“不肥而坚,是以永年。曼生作瓢壶铭。”这...
    紫砂壶友阅读 1,427评论 0 1