站在富士康的厂房里看建造者设计模式-阿里云开发者社区

开发者社区> 小弟的谷哥> 正文

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

简介: 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程0...
+关注继续查看

自定义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分析-漂亮的解耦套路》

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
3、Python与设计模式--建造者模式
#一、快餐点餐系统(2) 今天的例子,还是上一次谈到的快餐点餐系统。只不过,今天我们从订单的角度来构造这个系统。 最先还是有请上次的主角们: 主餐: ``` class Burger(): name="" price=0.0 def getPrice(self): return self.price def setPrice(se
8382 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
7251 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2509 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
8947 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11029 0
JAVA设计模式(2)建造者模式
1 定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类型:创建类模式。 四个要素: 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。
503 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
10541 0
Net设计模式实例之建造者模式(Builder Pattern)
一、建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。 建造者模式的优点是:使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以如要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
790 0
+关注
小弟的谷哥
welcome
766
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载