Android中的模式:Builder模式的优点赏析

问题引出: 

Android developer都写过AlertDialog,用法是先new 一个builder,然后往builder里设置属性的值,最后调用build得到类实例,完成抽象出来的类的实例化。

一个类的实例化为什么不是简单的new 对象,为什么要使用这种builder模式去build呢?

难写、难读、难维护 的重叠构造器:

Dialog中需要设置必要的参数ignorebutton、positivebutton,和可选的title、content、icon参数,这样就存在不止一个构造函数,类似

new Dialog(ignorebutton, positivebutton);

new Dialog(title, ignorebutton, positivebutton);

....

code中常有一个类有多个构造函数,构造函数的参数个数一般递增,层层调用,我们叫他重叠构造器模式(telescoping constructor)

参数个数少用这个不会有问题,参数个数多了,创建构造函数时,写参数会让人头疼,修改参数会让人很难维护。

易维护、难一致的JavaBean:

使用JavaBean的方式可以避免传参数不知道对应哪个字段、修改参数类型容易对应错的问题。在JavaBean的setter方法中明确了对应的字段和类型。省去了重叠构造方法。

但JavaBean也有他的缺陷, JavaBean对象可以随时调用setter方法进行设置,这会让Bean缺乏一致性、也就是类的实例的一致性没法保证了。特别是在多线程情况下,会出现很难分析的bug。

1 class Bean{
2 int x,
3 int y,
4 setx(){}
5 setY(){} 
6 }

保证了一致性、灵活性的Builder对象: 

Builder模式解决了JavaBean一致性的问题, 在Bean中创建内部Builder类,使用Builder中类似setter的方法设置对应的属性给Builder。然后通过public Bean build(){}方法,实例化Bean对象并返回给客户调用者,重要的是这个Bean对象是确定下来的, 而且Builder模式的灵活性,可以通过不同的setter生成多个自定义的Bean对象。

class Bean{
    class Builder{
        int x;
        int y;

public void setX(int x) {
            this.x = x;
        }
        public void setY(int y) {
            this.y = y;
        }
        public Bean build(){
            return new Builder();
        }
    }
}

客户使用Builder模式的方式:

Bean bean = (new Bean.Builder()).setX(8).setY(9).build();

Bean bean2 = (new Bean.Builder()).setX(1).setY(2).build();

bean和Bean2是2个完全独立的对象,而且每个单独的对象一旦创建不会存在变化导致的线程安全问题。

时间: 2024-09-29 03:34:34

Android中的模式:Builder模式的优点赏析的相关文章

Android中的创建型模式总结

共5种,单例模式.工厂方法模式.抽象工厂模式.建造者模式.原型模式 单例模式 定义:确保某一个类的实例只有一个,而且向其他类提供这个实例. 单例模式的使用场景:某个类的创建需要消耗大量资源,new一个对象代价太大,如访问IO和数据库等资源,或者避免多次创建该对象消耗内存过多. 懒汉模式 public class Singleton{ private static Singleton instance; private Singleton(){} public static synchronize

[转] Android中的设计模式-备忘录模式

转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色 笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出

小试Android中使用MVC框架模式

MVC简介 关于MVC网上的说法成千上万,每个人都有自己的理解,下面只是我个人现阶段学习的理解,欢迎指出不足之处~ MVC(Model View Controller 模型-视图-控制器) Model(模型)直接操作数据层(如数据库记录的读写等),通常有最重的处理任务 View(视图) 直接面向用户数据展示界面,接受用户的数据输入并传递给控制层 Controller(控制器)业务逻辑处理层,本身不输出任何东西和做任何处理.它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示

Android中的设计模式-状态模式

状态模式说明 "状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样." –<JAVA与模式> 管理者持有多种状态,状态切换后,管理者调用Handle方法时,间接调用状态类中的Handle方法,从而根据当前状态的不同,就可以表现出不同的结果. 状态模式类图 状态模式使用示例 例如一个变形金刚,假设它有3中状态:汽车状态,人形状态,飞机状态. 不同的状态进行战斗的时候,采用的方式不同,分别是"撞击碾压","赤

【学习笔记】Android中的Activity启动模式

先了解两个概念:任务栈ID.Activity实例ID 设置启动模式在manifests->ActivityManifest.xml里 <activity         android:name=".MainActivity"        android:launchMode="standard"> 一.标准模式standard 每次启动自己的Activity都会启动,任务栈ID一个,Activity实例ID每次都不一样 二.SingleTop

在JAVA和android中常用的单列模式

在很多开发中,项目为了节约资源,都把一个类的构造函数变为私有化,这样整个项目中就不能创建多个实例,这样的方法我们称为单例模式 现在通过代码来简介下这个单例模式: 在新建一个java项目后,创建一个实体类User.java,和测试类,main.java 代码如下: 1 public class User { 2 private static User user; 3 4 //添加该实例的属性 5 private String name; 6 private String sex; 7 privat

Android中的代理(Proxy)模式

一. Proxy模式定义 Proxy模式,也称代理模式,是经典设计模式中的一种结构型模式,其定义是为其他对象提供一种代理以控制对这个对象的访问,简单的说就是在访问和被访问对象中间加上的一个间接层,以隔离访问者和被访问者的实现细节. 二. Proxy模式理解 当无法或者不想直接访问某个对象, 或者访问某个对象存在困难时, 可以通过一个代理对象来间接访问, 为了保证客户端使用的透明性, 委托对象与代理对象需要实现相同的接口. 例如,ActivityManager 作为客户端要访问 AMS,AMS 不

android中活动的启动模式

活动的启动模式 1.standard 2.singleTop 3.singleTask 4.singleInstance standard为默认的活动启动模式(无论活动是否在栈顶,都会创建一个新的活动) sing了Top(如何栈顶有了新的活动就不会创建新的活动,会直接使用已经存在的活动) singleTask(可以解决重复创建栈顶活动的问题,创建新的活动之前会检查是否活动已经存在,若存在就把该活动之前的活动全部清出栈,将该活动显示在栈顶,否则就创建一个新的活动) singleInstance(该

Android 建造者(Builder)模式

关于 Builder 模式 详述:http://blog.csdn.net/jjwwmlp456/article/details/39890699 先来张图 看到 Android  中 使用了 Builder 模式的地方还是很多的. 使用时 大概如下: Notification noti = new Notification.Builder(context).build(); AlertDialog dialog = new AlertDialog.Builder(context).create

Builder模式详解及其在Android开发中的应用

一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比如说在一些常用的第三方库中也随处可见其踪迹,比如说一些常用的网络请求库如OkHttp或者是retrofit,又或者是图片加载库Glide中也不缺乏它的应用. 为什么Builder模式在Android或是Java开发中这么火呢?因为它相较于构造函数或者是Get/Set方法,它的灵活性和封装性上都比较有