Android自学历程—Builder()模式

  前一篇文章,在学习OKHttp的时候遇到Builder pattern,当然那时候还不知道这是Builder模式,只是觉得奇怪怎么后面跟了好多个点,后来通过了解才明白这是Android 中的建造者模式。稍微学习过android的,一定用过AlertDialog.buider,说来惭愧!当时没写博客,也就局限于会用的阶层。通过这篇,希望能更加的了解。

Builder Design pattern in Java

  建造者设计模式在Java中是一种创造类型的模式。例如,用来创建对象,类似如Factory method design pattern ,她也是一种创造型设计模式。在我们学习任何一种设计模式的时候,我建议寻找到这种设计模式所解决的实际的问题。Its been well said necessity is mother on invention.(神句子,大意是因为需求所以被创造)。脱离实际的问题而学习设计模式是没有作用的,相反的,如果你已经遇到了问题那么你会更加的了解设计模式并且能够学会如何解决问题。在此Java设计模式的教程中,我们首先将会了解Builder design pattern所解决的实际的问题,这将给我们一些启示,我们该什么时候使用建造者模式。之后我们还会看见一下实例去了解建造者模式的优缺点。

What problem Builder pattern solves in Java

正如我之前所说的,Builder pattern 是一种创造型模式,这就意味的他所解决的问题与对象的创建有关。Java中的构造函数通常被用来创建对象,并且可以携带创建对象所需要的参数。问题就在于当创建一个对象可以有很多个参数时,一些参数可能是强制性的还有一些可能是可选的。我们想像一下有一个类,这个类是被用来创建蛋糕的,现在你需要去记着一些参数例如,鸡蛋,牛奶,面粉的比例去创建一个蛋糕。其中的一些是强制性的,还有一些是可选的例如,cherry,fruits。如果我们为每一个不同的对象都去重载构造函数,那势必会有好多好多的构造函数,并且最坏的就是他们会有好多好多的参数。

problem:

1)需要太多的构造函数

2)因为太多的字段所以容易出错。例如,

sugar and and butter are in cups so instead of 2 cup sugar if you pass 2 cup butter, your compiler will not complain but will get a buttery cake with almost no sugar with high cost of wasting butter.

(能力至此,实在不懂)

Example of Builder Design pattern in Java

我们将会使用相同的例子通过使用Builder design pattern,

Guidelines for Builder design pattern in Java

1.创建一个叫做 Builder 的静态内部类(a static nested class),这这个类里面的对象将会通过Builder被创建。在这个例子里面对象是Cake。

2.

3.

4.

5.

BuilderPatternExample.java

public class BuilderPatternExample {
        public static void main(String arg[]) {
            //Creating object using Builder pattern in java
            Cake whiteCake = new Cake.Builder()
                                                    .sugar(1)
                                                    .button(0.5)
                                                    .egg(2)
                                                    .vanila(2)
                                                    .flour(1.5)
                                                    .bakingpowder(0.75)
                                                    .milk(0.5)
                                                    .builder();
            //Cake is ready to eat :)
            System.out.printIn(whiteCake);
        }
}

Cake.class

Class Cake{
    private final double sugar;    //cup
    private final double butter;    //cup
    private final int eggs;
    private final int vanila;           //spoon
    private final double flour;       //cup
    private final double bakingpowder    //spoon
    private final double milk;        //cup
    private final int cherry;

    public static class Builder {
        private double sugar;     //cup
        private double butter;    //cup
        private int eggs;
        private int vanila;          //spoon
        private double bakingpoeder    //spoon
        private double milk;        //spoon
        private int cherry;

        //builder methods for setting property
        public Bulider sugar(double cup){this.sugar = cup; return this;}
        public Builder butter(double cup){this.butter = cup; return this; }
        public Builder eggs(int number){this.eggs = number; return this; }
        public Builder vanila(int spoon){this.vanila = spoon; return this; }
        public Builder flour(double cup){this.flour = cup; return this; }
        public Builder bakingpowder(double spoon){this.sugar = spoon; return this; }
        public Builder milk(double cup){this.milk = cup; return this; }
        public Builder cherry(int number){this.cherry = number; return this; }

        //return fully build object
        public Cake build() {
            return new Cake(this);
        }

        //private constructor to enforce object creation through builder
    private Cake(Builder builder) {
        this.sugar = builder.sugar;
        this.butter = builder.butter;
        this.eggs = builder.eggs;
        this.vanila = builder.vanila;
        this.flour = builder.flour;
        this.bakingpowder = builder.bakingpowder;
        this.milk = builder.milk;
        this.cherry = builder.cherry;
    }

@Override
    public String toString() {
        return "Cake{" + "sugar=" + sugar + ", butter=" + butter + ", eggs=" + eggs + ", vanila=" + vanila + ", flour=" + flour + ", bakingpowder=" + bakingpowder + ", milk=" + milk + ", cherry=" + cherry + ‘}‘;
 }

output:

Cake{sugar=0.75, butter=0.5, eggs=2, vanila=2, flour=1.5, bakingpowder=0.0, milk=0.5, cherry=0}

Builder design pattern in Java – Pros and Cons(优缺点)

构造者模式也有缺点,但是相对于优点还是很多的。如论如何都有一些优点和缺点关于 Builder design pattern在创建对象时。

优点:

1.更加的可维护 如果创建的对象需要的字段数(参数)超过4~5个

2.更少的出错

3.更加健壮,只有完整的构造函数能够被客户端得到

缺点:

1.冗长的代码重复,建设者需要从原始副本各领域或项目类复制

When to use Builder Design pattern in Java

建造者模式是一种创造型的模式并且应该用来当构造函数的参数数量多余易管理的4~5个。不要混淆Builder 和 Factory模式,她们之间有着明显的区别。

as Factory can be used to create different implementation of same interface but Builder is tied up with its Container class and only returns object of Outer class.

更多详情:

译文:http://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html

http://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html

http://jlordiales.me/2012/12/13/the-builder-pattern-in-practice/

http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern

android builder pattern

时间: 2024-07-31 14:31:44

Android自学历程—Builder()模式的相关文章

Android自学历程—回调函数的意思(源码+例子)

为什么会学习回调函数,那还要从线程说起.虽然以前写过一篇文章叫做“Android自学历程—多线程”,现在看看还是太年轻了. 在学习线程的时候,我试着看了看Handler的源码,于是对其中的Callback接口产生了兴趣.于是补自身不足,拿来学习学习.废话到此为止,整理思路,一起来学习. 下面这是一段Handler的源码 /** * Callback(回收) interface(界面) you can use when instantiating(例示) a Handler to avoid *

Android自学历程—OkHttp的基本使用

前段时间学习线程,想通过子线程获取网络图片,进而更新主UI界面的学习.发现大部分的Demo都是基于HttpClient的使用,但google似乎削弱了HttpClient,我甚至只能找到HttpURLConnection的相关类.没办法,只能寻找新的途径,这就是这篇译文的由来. 开始之前: 1.下载最新版本的OKHttp的Jar包,和Okio的Jar包. 2.在Android studio 中,导入Jar包. 最快捷的方式是:(但是我有时候我这样操作没用,不知道问什么,之后乖乖下载再导入Jar包

Android自学历程—Material Design的Tabs

好几天没写博客了,今天给大家带来一篇不错的译文.我照着练习了段时间,还有买了新书<android开发艺术探索>,如果好的话给大家分享分享. 用Android Material Design的方式处理Tabs Android Design Support Library这个类可以使我们更加向后兼容Androoid 2.1,去使用material design的组建.在Design support Library中,一些组建如:navigation drawer, floating action

Android自学历程—手把手教你使用OkHttp(基础篇)

安装 在使用OkHttp前,我们需要先导入OkHttp的第三方库. 我们可以在Github上找到她的项目地址: https://github.com/square/okhttp 我们可以在Android Studio中使用Gradle, 最后效果如下: 测试使用我们的OKHttp第三方库 1.第一步我们需要去创建一个 OKHttpClient 对象 OkHttpClient okHttpClient = new OkHttpClient(); 2.下一步我们还需要一个 Request 对象,她可

Android自学历程—围住神经猫开发

学习核心内容: 1. 学会SurfaceView的绘图技巧. 2. 掌握神经猫的游戏逻辑设计. 第一阶段主要完成内容: 并且创建游戏所需的类,搭建基本的代码结构. 创建一个二维数组,用于保存游戏场景,并且将场景初始化. SurfaceView中根据场景数据,在界面中绘制点阵. 先上代码 1 package com.ryan.catchcrazycat; 2 3 /** 4 * Created by air on 15-8-1. 5 */ 6 public class Dot { 7 8 /* 9

Android自学历程—Surfaceview整理总结

这里借鉴了不少博主的劳动成果,先表示感谢.(一定要自己整理才能看的进去--) 其实这里还有个疑惑,SurfaceView与View的区别,以及如何选择使用. 涉及到画面更新的需求.一种是主动更新,另一种是被动更新.类似棋牌类游戏,需要被动的点击去触发它,完全可以采用View. 而比如罗盘,需要一直在旋转,这个时候需要一个线程去处理它.此种情况选用SurfaceView 先看看官方的解释 SurfaceView的API介绍 Provides a dedicated drawing surface

Android自学历程—RecyclerView的使用(2)

Introduction to RecyclerView RecyclerView在Android 5中被介绍,在 Support-V7的包中.她允许展示items在随意任何之处(可联想ListView),正如包名所说的,在API7以上均可使用(Android 22).   她的名字来自于其工作的方式,当一个Item被隐藏时,不是去destroyed她并且随后为每一个新new出来的对象去创建一个新的item,隐藏的item被回收:她们被重用,并且会有新的数据绑定她们. 一个RccyclerVie

Android自学历程—ListView由简入深

前段时间学习了RecyclerView,发现对ListView有更加明显的感觉,于是决定把之前理清点思路的ListView,整理整理毕竟在5.0普及之前,ListView还是有用武之地的.一如既往的我们从简单的开始.——站在巨人的肩膀之上 译自:https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView#using-a-basic-arrayadapter,可能本人理解不深,翻译偏生硬,带

Android自学历程—RecyclerView的使用

在网上看见有关RecyclerView的介绍,说是ListView的进阶版,官方推荐,便找来资料,耍耍. 首先挂上官方的教程,官方是最具权威和最让人信服的第一手资料. https://developer.android.com/training/material/lists-cards.html To create complex lists and cards with material design styles in your apps, you can use the RecyclerV