设计模式笔记(三)——建造者模式 原

1. 需求矛盾

l  同一个厨师,可能每次炒的菜味道不一样! l  但全国各地的肯德基,味道都几乎一个味???

思考:

1)  为什么我每次吃到的菜,味道都不一样?到底菜被什么控制了?

2)  为什么肯德基的快餐谁做都一个样?这些快餐又被什么控制了?

3)  哪种控制方式更符合设计模式里提到的原则?符合什么原则? ——依赖倒转原则

2. 是什么——定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。

3. 为什么——特点

在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定,这就需要用到建造者模式。它将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

4. 什么时候用——适用性

一些基本部件不会变,而其组合经常变化的时候。

5. UML图

6. 怎么用——使用方法

需求:

画王八!

6.1  没有任何原则的初始设计

class Turtle {
    public void paint() {
        System.out.println("头。。。");
        System.out.println("身体。。。");
        System.out.println("壳。。。");
        System.out.println("腿。。。");
        System.out.println("尾巴。。。");
    }
}

新加需求:画日本王八!

class JapanTurtle {
    public void paint() {
        System.out.println("头。。。");
        System.out.println("身体。。。");
        System.out.println("腿,,。,");
        System.out.println("尾巴。。。");
    }
}

哎呀不好,忘了加壳了。。。

class JapanTurtle {
    public void paint() {
        System.out.println("头。。。");
        System.out.println("身体。。。");
        System.out.println("壳。。。");//忘了,后来加上的
        System.out.println("腿,,。,");
        System.out.println("尾巴。。。");
    }
}

显然这种方式已经不合理了!

6.2  应用建造者模式

class Turtle {
    public void paint() {
        paintHead();
        paintBody();
        paintShell();
        paintLeg();
        paintTail();
    }

    private void paintTail() {
        System.out.println("尾巴。。。");
    }

    private void paintShell() {
        System.out.println("壳。。。");
    }

    private void paintLeg() {
        System.out.println("腿。。。");
    }

    private void paintBody() {
        System.out.println("身体。。。");
    }

    private void paintHead() {
        System.out.println("头。。。");
    }
}

这里的paint方法起到了“指挥者”(Director)的作用,如果王八缺胳膊少腿了(虽然王八也没胳膊),一定是指挥者的问题,找他就完事了。或者王八进化了,不需要壳了?!找指挥者把壳那一部分去掉就完事了。

7. 建造者模式与抽象工厂模式的对比

抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品,两者的区别还是比较明显的。  ——https://www.cnblogs.com/ChinaHook/p/7471736.html

我觉得这段说的挺好的。。。(手动滑稽)

其实总结一下就是两句话:

  • 抽象工厂模式,因为只看接口和对象的所属群体,所以要写一大堆类和接口支撑。。。
  • 建造者模式,所有的组成部分都需要指挥者控制,所以要写一大堆方法支撑。。。

多的我也总结不出来了,毕竟还是太菜。。。(手动滑稽) 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

1095 火星人

1095 火星人 2004年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 D...

35610
来自专栏斑斓

迪米特法则与重构

在面向对象设计的世界里,有一个寻常却又常常为人所忽略的原则——“迪米特(Law of Demeter)”法则。这个原则认为,任何一个对象或者方法,它应该只能调用...

1096
来自专栏Python小屋

Python实现大自然数分解为最多4个平方数之和(1)

问题描述:任意大自然数,总是能分解为最多4个平方数的和,所谓平方数是指它是一个自然数的平方。例如:72884 = 4^2 + 138^2 + 232^2,337...

2724
来自专栏Aloys的开发之路

关于强制式(命令式)语言和声明式语言的区别

在阅读Alfred V.Aho等的大作Compilers Principles,Techniques and Tools是看到如下一段话: Another  c...

2765
来自专栏C语言及其他语言

初学C语言的学习计划

背景:很多同学在学习C语言的过程中,常常会遇到这样的问题,即“教材看完了,知识点也懂,但写不出来程序”,这段时间,我们通过长期与有多年C语言研究经验的教授、教师...

3614
来自专栏怀英的自我修炼

Java漫谈1

对于接触编程的人来说,Java更多地代表了一门编程语言。 Java是一门通用的计算机编程语言,它是并行的,基于类的,面向对象的,可以一次编写到处运行的一门语言。...

37714
来自专栏IT笔记

聊聊JAVA中 String类为什么不可变

前言 "我的风格比较偏传统和经典" 小明说,"我们在打扮自己的问题上还是蛮冒险的...我觉得当你是只狗的时候,穿什么都hold的住!" ? 哈哈哈,脱离单身狗快...

41919
来自专栏数据结构与算法

生理周期POJ 1006

Description 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会...

2747
来自专栏NetCore

关于某道C#上机题的OO

前两天在园子里,有人出了一道《关于一道C#上机题的一点想法》,大概的意思呢是利用OO的思想来进行编程,接着又有一位朋友,也写了自己的答案,此朋友非常厉害,从类图...

2226
来自专栏小詹同学

Python系列之六——拿什么拯救你?我的大脑

我一定是智障了,话不多说,上图上图~ ? 就是这样10个选择题,你没有看错,我一定是个智障了~佩服不用穷举,也不用参考网上的大...

3654

扫码关注云+社区

领取腾讯云代金券