站在富士康的厂房里看建造者设计模式



自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理



探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制



Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


版权声明


建造者模式简介

建造者模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。看到这个文绉绉的定义,多半是一头雾水。没事儿,咋们用大白话来说:建造者模式是创建复杂对象的模型,它将构建的过程和所用的部件解耦从而使得构建过程和所用部件分离开。

举个例子:很多手机厂商与富士康合作生产手机,而且手机厂商对于手机的CPU,主板,内存,屏幕的要求各不相同。对于富士康而言,它需要去了解CPU的性能,内存的大小,屏幕的分辨率这些部件的详细的技术信息么?不需要,作为代工厂商它不需要深入了解部件,它所关注的是:拿到手机厂商提供的各个部件组装成手机就行!对于,手机厂商而言,它需要去了解富士康的生成状况,人员流动,组装过程么?不需要,作为手机厂商,它所关注的是:把各个部件给富士康,至于怎么组装那是富士康的事!

这就是部件与构建过程的分离。通过该方式,两者的耦合也降到了最低。继续刚才的例子:富士康不但可以给联想装配手机,还能给苹果装配手机,只要手机厂商提供所需的部件就行。类似地,假若苹果不想和富士康合作了,它将部件交给另外的代工厂商穷士康也是完全可以的,至于手机组装过程它依然无需关注。

在建造者模式中,有如下四个角色:

  • Director : 导演类,负责安排组装过程。比如可以安排Builder先构造哪个部分,后构造哪个部分
  • Builder : 抽象的建造者类,负责规范产品的组建,一般由其子类实现具体的构建过程。
  • ConcreteBuilder : 具体的建造者类,实现Builder的所有方法,并返回构件好的对象.
  • Product:产品类

建造者模式示例

通过之前的介绍,我们对于建造者模式有了初步的理解,现在我们通过一个完整的示例进一步了解建造者模式

产品类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class Mobile {

    private String cpu;
    private String mainboard;
    private String memory;
    private String screen;

    public String getCpu() {
        return cpu;
    }
    public void setCpu(String cpu) {
        this.cpu = cpu;
    }
    public String getMainboard() {
        return mainboard;
    }
    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }
    public String getMemory() {
        return memory;
    }
    public void setMemory(String memory) {
        this.memory = memory;
    }
    public String getScreen() {
        return screen;
    }
    public void setScreen(String screen) {
        this.screen = screen;
    }
    @Override
    public String toString() {
        return "Mobile [cpu=" + cpu + ", mainboard=" + mainboard + ", memory=" + memory + ", screen=" + screen + "]";
    }

}

这是我们的手机产品类,它包含了CPU,主板,内存,屏幕等部件。

抽象的建造者类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public abstract class Builder {
    public abstract void buildCpu(String cpu);
    public abstract void buildMainboard(String mainboard);
    public abstract void buildMemory(String memory);
    public abstract void buildScreen(String screen);
    public abstract Mobile create();
}

该负责建造者抽象类中规范产品的组建。

具体的建造者类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class MobileBuilder extends Builder {
    private Mobile mobile=new Mobile();
    @Override
    public void buildCpu(String cpu) {
        mobile.setCpu(cpu);
    }

    @Override
    public void buildMainboard(String mainboard) {
        mobile.setMainboard(mainboard);
    }

    @Override
    public void buildMemory(String memory) {
        mobile.setMemory(memory);
    }

    @Override
    public void buildScreen(String screen) {
        mobile.setScreen(screen);
    }

    @Override
    public Mobile create() {
        return mobile;
    }

}

具体建造类实现抽象建造类(Builder)的所有方法,并返回构件好的对象。

导演类

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class MobileDirector {
    Builder builder=null;
    public MobileDirector(Builder builder) {
        this.builder=builder;
    }

    public Mobile createMobile(String cpu,String mainboard,String memory,String screen) {
        this.builder.buildCpu(cpu);
        this.builder.buildMainboard(mainboard);
        this.builder.buildMemory(memory);
        this.builder.buildScreen(screen);
        Mobile mobile = this.builder.create();
        return mobile;
    }

}

该导演类安排组装过程。例如在此处指定先构建CPU再构建主板和内存,最后构建屏幕。

客户端

嗯哼,关于建造者模式的四个角色都已经就位了,我们来瞅瞅客户端的代码。

package cn.com;
/**
 * 原创作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
public class TestBuilderPattern {

    public static void main(String[] args) {
        Builder builder=new MobileBuilder();
        MobileDirector mobileDirector=new MobileDirector(builder);
        Mobile mobile = mobileDirector.createMobile("高通cpu", "华为主板", "东芝内存", "夏普屏幕");
        System.out.println(mobile);
    }

}

在客户端中我们将部件传递给导演类,导演类返回构件好的产品给客户端。对于客户端而言,它无需过多关注构建的过程;对于导演类来说,它无需过多关注部件的细节。


建造者模式的应用

在实际开发中,建造者模式作为常见的设计模式被广泛应用,比如:

  • StringBuilder
    嗯哼,这个熟悉吧,不再赘述
  • SqlSessionFactoryBuilder
    哇哈,我们在《 Mybatis研习录》中也用到了这个玩意儿
  • AlertDialog.Builder
    做Android开发的小伙伴,是不是从入门开始就已经开始用了呢?当然。
  • Retrofit
    目前,Android开发领域火爆的网络框架Retrofit也用到了建造者模式。我们通常这么写:

    Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

    当然,除了建造者模式以外,Retrofit还用多了众多设计模式使其成为优秀的网络请求框架。
    至于Retrofit的深入剖析请参见《Retrofit分析-漂亮的解耦套路》

时间: 2025-01-24 13:23:14

站在富士康的厂房里看建造者设计模式的相关文章

站在旁观者的角度去看国内整个电商

站在旁观者的角度去看国内整个电商,各家移动电商的发展, app几乎成为标配,各有特色. 但是,你可能没有想到,近段时间以来一直被频繁提及的外贸电商,却是另外一片风景.Ebay最近发布的一项报告显示,有63%的中国中小外贸企业仍未对网站进行移动优化.在移动表现上,内外电商相形见绌. 随便搭建起一个外贸电商网站,做点谷歌投放,便能有不错的订单收入囊中,这是早批中小型外贸电商最直接的掘金形态,谷歌退出中国对外贸电商是不小的打击,但是,并没有从根本上影响其积累下的盘子. 大多数人多外贸的感知就是低调.其

申请证书后,在IE里看这个证书,证书上面说:“您有一个与该证书的私钥”,试问这个私钥在哪里啊?通过IE的证书导出也不去?

问题描述 申请证书后,在IE里看这个证书,证书上面说:"您有一个与该证书的私钥",试问这个私钥在哪里啊?通过IE的证书导出也不去? 解决方案 解决方案二:在线等待,谢谢大侠了先解决方案三:在线等待,谢谢大侠了先解决方案四:DDDDDDDDDDDDD解决方案五:以前用过"中国建设银行"的网上银行. 如果没记错的话,是在IE菜单的"工具"-->"INTERNET 选项"-->"内容"-->证书

走过版权争夺、流量比拼和行业整合,站在新的起点上看整个行业

9月13日电 走过版权争夺.流量比拼和行业整合,站在新的起点上看整个行业, 优酷土豆 集团董事长兼CEO 古永锵 有着更明确的打算. "优酷土豆合并的这一年里你最大的收获是什么?" 当记者提问时,他说:"收获是可以让我们抬起头来真正向前看一看未来,并开始行动." 协同效应成效明显 对古永锵来说,合并是一种解放,这让他能够摆脱过去优酷和土豆竞争时代那种贴身肉搏,转而有时间和精力去站在整个行业的高度思考视频的未来并作出布局."现在合并完了,我们不是向前看一秒,

C#设计模式之建造者设计模式(Builder)

一.建造者(Builder)模式 建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 对象性质的建造 有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用.比如,一个电子邮件有发件人地址.收件人地址.主题.内容.附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出. 有些情况下,一个对象的一些性质必须按照某个顺序赋值才有意义.在某个性质没有赋值之前,另一个性质则无法赋值.这

Java建造者设计模式详解_java

建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 使用场景: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同的表示时. 通用类图: 举例:我们生活当中有许多设备都是以组装的形式存在的,例如台式电脑,那么有些厂商就会推出一些具有默认配置的组装电脑主机(这里可以用到模板方法模式来实现),顾客可以购买默认配置的产品,也可以要求厂商重新组装一部不同配置不同组装方式的主机.此时,我们就可以使

从《古惑仔》里看流氓的数据陷阱

在上个世纪90年代的一个初夏的傍晚,微风拂面,知了不停地鸣叫.在校园里,每个教室里都传出了沙沙的声音,一个个表情木讷的高三学生正在题海中遨游.教室的最后一排,一个扎着马尾的清秀姑娘给旁边的男孩传了一张纸条,上面写着"听说电影院今天演<泰坦尼克号>,我们逃课去看吧!" 男孩看到纸条后,脸上泛出了淡淡的红晕,一脸亢奋地回了张纸条,"我听说人民街的录像厅今天放最新的<古惑仔>啊,我们去看那个吧."      那天晚上,这一男一女在男生的坚持下,还是

从富士康又出一跳看个人站长的生存问题

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 第一次在A5上发文章,不知道能不能通过审核,呵呵.主要是今天看到一条新闻,有话想说,总结一下自己一年多来的网络历程,算是对自己一个交代吧. 新闻这样的, 据说昨天11月5日,富士康又跳了一个,这已经是多少跳了,记不清了,一次次加薪仍未能避免悲剧的发生,不过富士康据说每月的加班时间超过100个小时,而国家规定劳动者每日延长工作时间不得超过3小时

新站营销三板斧 新手站长必看

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 建网站是个技术活,网站推广更是一个技术活.对于新手站长来说,网站刚刚建立起来的时候,看着自己一手辛辛苦苦建立起来的网站,就像看自己的孩子一样,充满喜悦.但是随着时间一天天过去,访问你网站的人聊聊无几,你的喜悦就就会渐渐被失落所代替.即使你建一个个人博客也好,也希望有更多的人能看到你发表的文章,和大家分享你的喜怒哀乐.所以,网站建好了,你就要吆

桃花源记站长篇,寻找梦里水乡

东晋太元年间,有个武陵人以织网做站为生.有一天他顺着2M带宽的中国电信"百度"前行,忘记了路程的远近.忽然遇到一片桃花林,桃树夹着光缆两岸,长达几百M,中间没有别的树,地上香草鲜艳美丽,坠落的花瓣繁多交杂.渔人很惊异这种美景.再往前走,想走完那片桃林.  桃花林在中国电信大楼处就不见了,紧接着就看见一座山,山上有个小洞口,里面好像有光亮.渔人就丢下modem,从洞口进去.开始洞口很窄,仅容一个人通过.又走了几十M,突然变得开阔敞亮了.这里土地平坦开阔,房屋整整齐齐,有肥沃的田地,美丽的