Android中的设计模式之构建者模式

简介: 参考《设计模式:可复用面向对象软件的基础 》3.2 Builder 生成器--对象创建型模式《Android源码设计模式解析与实战》第3章 Builder模式意图将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

参考

  • 《设计模式:可复用面向对象软件的基础 》3.2 Builder 生成器--对象创建型模式
  • 《Android源码设计模式解析与实战》第3章 Builder模式

意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

适用性

  • 相同的方法,不同的执行顺序,产生不同的事件结果时。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适。
  • 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。

结构

Builder模式
  • Product
    • 表示被构造的复杂对象
    • 包含定义组成部件的类,包括将这些部件装配成最终产品的接口
  • Builder 抽象Builder类,为创建一个Product对象的各个部件指定抽象接口,规范产品的组建,一般是由子类实现具体的组建过程。
  • ConcreteBuilder 具体的Builder实现类
  • Director 使用Builder接口进行构造

协作

  • 客户创建Director对象,并用它所想要的Builder对象进行配置。
  • 一旦产品部件被生成,Builder就会通知生成器
  • 生成器处理Builder的请求,并将部件添加到该产品中。
  • 客户从生成器中检索产品
协作序列图

例子1:RTF阅读器

一个RTF(Rich Text Format)阅读器应能将RTF转换为多种正文格式。该阅读器可以将RTF文档转换为普通ASCII文本或者一个能以交互方式编辑的正文窗口组件。但问题是在于可能转换的数目是无限的。因此要能够很容易地实现新的转换的增加,同时却不改变RTF阅读器。

一种解决办法就是运用Builder模式,用一个可以将RTF转换成另一种正文表示的TextConverter对象配置这个RTFReader类。当RTFReader对RTF文档进行语法分析时,它使用TextConverter去做转换。

RTFReader类设计

每种转换器类将创建和装配一个复杂对象的机制隐含在抽象接口的后面。转换器独立于阅读器,阅读器负责对一个RTF文档进行语法分析。

每一个转换器类可以作为生成器builder,而阅读器作为director。Builder模式将分析文本格式的算法与描述怎样创建和表示一个转换后格式的算法分离开来。这使得我们可以重用RTFReader的语法分析算法,分局RTF文档创建不同的正文表示--仅需使用不同的TextConverter的子类配置该RTFReader即可。

例子2:组装电脑

我想随意组装一台电脑,比如一台Inter主板,Retina显示屏,MacOs的电脑

计算机的组装过程较为负复杂,并且组装顺序是不固定的,所以我们可以用Buider模式。

组装电脑

示例代码:

// 电脑基础抽象类
public abstract class Computer {
    protected String mBoard;
    protected String mDisplay;
    protected String mOS;
    protected Computer(){}
//设置主板
public void setBoard(String board){
    this.mBoard=board;
}
//设置显示器
public void setDisplay(String display) {
    mDisplay=display;
}
//设置操作系统
public abstract void  setOS();

@Override
    public String toString() {
    StringBuilder stringBuilder=new StringBuilder();
    if (mBoard!=null) {
        stringBuilder.append("myBoard is:"+mBoard);
    }
    if (mDisplay!=null) {
        stringBuilder.append("\nmDisplay is:"+mDisplay);
    }
    if (mOS!=null) {
        stringBuilder.append("\nmyOS is:"+mOS);
    }
    return stringBuilder.toString();
    }
}

//Macbook电脑,实现了setOs
public class MacBook  extends Computer{

    @Override
    public void setOS() {
        mOS="Mac _S X 10.10";
    }

}

// 抽象Builder
public abstract class Builder{
  abstract  Buider buildBoard(String board);
  abstract  Buider buildDisplay(String display);
  abstract  Buider buildOS();
  abstract Computer create();
}

//具体的一个Builder类
public class MacBookBuilder extends Buider {
    private Computer mComputer=new MacBook();

    @Override
    public Buider buildBoard(String board) {
        mComputer.setBoard(board);
        return this;
    }

    @Override
    public Buider buildDisplay(String display) {
        mComputer.setDisplay(display);
        return this;
    }

    @Override
    public Buider buildOS() {
        mComputer.setOS();
        return this;
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}
// Director类,负责构造Computer
public class Director{
    Builder mBuilder = null;
    public Director(Builder builder){
        mBuilder = builder;
    }
    public void construct(String board,String display){
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOs();
    }
}

//使用
public static void main(String[] args) {
        Builder macBookBuilder=new MacBookBuilder();
        Director director = new Director(macBookBuilder);
        // 使用Director构造
        director.construct(英特尔主板,retina);
        System.out.println(macBookBuilder.create().toString())
        // 通常我们都会通过Builder的链式调用省略Director类,比如如下所示
        System.out.println(macBookBuilder.buildBoard("英特尔主板")
        .buildDisplay("retina")
        .buildOS()
        .create().toString());
    }

结果:
myBoard is:英特尔主板
mDisplay is:retina
myOS is:Mac _S X 10.10

效果

  • 它使你可以改变一个产品的内部表示
  • 它将构造代码和表示代码分开
  • 它使你可对构造过程进行更精细的控制
  • 《Effective java》书中建议如果构造一个对象复杂,需要传入很多参数,不妨采用Builder模式,有效减少了传参失误。
  • 当然缺点是增加了代码量。

例子3 Android中的AlertDialog.Builder

// todo 后更

目录
相关文章
|
5天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
9天前
|
存储 Java Android开发
探索安卓应用开发:构建你的第一个"Hello World"应用
【9月更文挑战第24天】在本文中,我们将踏上一段激动人心的旅程,深入安卓应用开发的奥秘。通过一个简单而经典的“Hello World”项目,我们将解锁安卓应用开发的基础概念和步骤。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供一次实操体验。从搭建开发环境到运行你的应用,每一步都清晰易懂,确保你能顺利地迈出安卓开发的第一步。让我们开始吧,探索如何将一行简单的代码转变为一个功能齐全的安卓应用!
|
2月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
52 10
|
2月前
|
设计模式 Android开发 Kotlin
Android经典实战之Kotlin委托模式和by关键字
本文介绍了Kotlin中`by`关键字在类及属性委托中的运用,通过实例展示了如何利用类委托简化接口实现,以及如何借助标准与自定义属性委托管理属性的读写操作。通过`by`关键字的支持,Kotlin使得委托模式的实现更为直观且高效。
50 4
|
19天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
12天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
9天前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
23天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
47 5
|
7天前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
25天前
|
开发工具 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的关键考量
在数字时代的浪潮中,安卓和iOS这两大操作系统如同双子星座般耀眼夺目,引领着移动应用的潮流。它们各自拥有独特的魅力和深厚的用户基础,为开发者提供了广阔的舞台。然而,正如每枚硬币都有两面,安卓与iOS在开发过程中也展现出了截然不同的特性。本文将深入剖析这两者在开发环境、编程语言、用户体验设计等方面的显著差异,并探讨如何根据目标受众和项目需求做出明智的选择。无论你是初涉移动应用开发的新手,还是寻求拓展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议,帮助你在安卓与iOS的开发之路上更加从容自信地前行。
下一篇
无影云桌面