整合大量开源库温习基础项目(二)顺便再提提单例模式

转载请注明出处:王亟亟的大牛之路

这一篇,属于开篇,把我们初期用到的一些资源做展示,之后会陆续添加,当然这是一个Git的public项目,更欢迎你的加入!

每个程序员都想,写点天花乱坠的东西,但是需求决定创造,往往我们不知道去做些什么,之前写了一些登录啊,注册啊,噼里啪啦一堆东西的小项目,然后做到核心部分,这个App要干什么?就茫然了。。。然后?。。然后就闲置了。。。So。。。。这一次从头再来。。。还是做一步想一步,让代码更合理,可读性更强,设计更合理(拒绝反人类),那么 GO GO GO GO !!

首先先贴一下这一系列使用到的库:
(这几个在我之前的文章中都有出现过)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'cn.pedant.sweetalert:library:1.3'
    compile 'cn.trinea.android.common:trinea-android-common:4.2.15'
    compile 'com.apkfuns.logutils:library:1.0.6'
}

sweetalert:https://github.com/pedant/sweet-alert-dialog
理由:看上去可爱,风格喜欢,简单易用,大小合适。

logutils:https://github.com/pengwei1024/LogUtils
理由:满足需求,呈现样式清晰

trinea-android-common:https://github.com/Trinea/android-common
理由:大牛的工具库(虽然我只用他的ImageCache部分),轻量级的缓存,符合需要。

包结构:
这里写图片描述

运行的效果
这里写图片描述

SweetDialog的一些效果:
最通常的Dialog

这里写图片描述

ErrorDialog

这里写图片描述

自定义Dialog

这里写图片描述


项目中的这些工具类都是以单例模式的形式出现在项目中(这话我说的是不是有些别扭?),像这样:
(这部分每个方法的new SweetAlertDialog(Context)部分还可以做优化,重用什么的。但是重点不在这里,想说的是,整个应用只有一个DialogUtils 的事例)

public class DialogUtils implements Serializable {

    private static class SingletonHolder {
        /**
         * 单例对象实例
         */
        static final DialogUtils INSTANCE = new DialogUtils();
    }

    public static DialogUtils getInstance() {
        return SingletonHolder.INSTANCE;
    }

    /**
     * private的构造函数用于避免外界直接使用new来实例化对象
     */
    private DialogUtils() {
    }

    /**
     * readResolve方法应对单例对象被序列化时候
     */
    private Object readResolve() {
        return getInstance();
    }

    /*標題對話框
    * @param Context context:上下文對象
    * @param String msg:標題的文字
    * */
    public void showTitleDialog(Context context, String msg) {
        new SweetAlertDialog(context)
                .setTitleText(msg)
                .show();
    }

    /*標題+文字對話框
    * @param Context context:上下文對象
    * @param String title:標題
    * @param String msg: 具體文字內容
    * */
    public void showTitleAndMsgDialog(Context context, String title, String msg) {
        new SweetAlertDialog(context)
                .setTitleText(title)
                .setContentText(msg)
                .show();
    }

    /*錯誤提示對話框
    * @param Context context:上下文對象
    * @param String title:標題
    * @param String msg: 具體文字內容
    * */
    public void showErrorDialog(Context context, String eTitle, String msg) {
        new SweetAlertDialog(context, SweetAlertDialog.ERROR_TYPE)
                .setTitleText(eTitle)
                .setContentText(msg)
                .show();
    }

    /*警告對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param String confimText:按鈕的文字
    * */
    public void showWarningDialog(Context context, String eTitle, String msg, String confirmText) {
        new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(eTitle)
                .setContentText(msg)
                .setConfirmText(confirmText)
                .show();
    }

    /*成功對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * */
    public void showSuccessDialog(Context context, String title, String msg) {
        new SweetAlertDialog(context, SweetAlertDialog.SUCCESS_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .show();
    }

    /*自定義icon對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param int icon:圖片素材
    * */
    public void showCustomIconDialog(Context context, String title, String msg, int icon) {
        new SweetAlertDialog(context, SweetAlertDialog.CUSTOM_IMAGE_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .setCustomImage(icon)
                .show();
    }

    /*綁定按鈕事件對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param String confirmText:按鈕的文字
    * setConfirmClickListener: 監聽事件
    * */
    public void showWarningListenerDialog(final Context context, String title, String msg, String confirmText) {
        new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .setConfirmText(confirmText)
                .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sDialog) {
                        sDialog.dismissWithAnimation();
                    }
                })
                .show();
    }

    /*綁定複雜按鈕事件對話框
    * @param Context context:上下文對象
    * @param String eTitle: 標題
    * @param String msg:具體的文字內容
    * @param String confirmText:按鈕的文字
    * setConfirmClickListener: 確認監聽事件
    * setCancelClickListener: 取消監聽事件
    * */
    public void showWarningAllDialog(final Context context, final String title, String msg, String cancelText, String confirmText) {
        new SweetAlertDialog(context, SweetAlertDialog.WARNING_TYPE)
                .setTitleText(title)
                .setContentText(msg)
                .setCancelText(cancelText)
                .setConfirmText(confirmText)
                .setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sDialog) {
                        sDialog.dismissWithAnimation();
                    }
                })
                .showCancelButton(true)
                .setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
                    @Override
                    public void onClick(SweetAlertDialog sDialog) {
                        sDialog.cancel();
                    }
                })
                .show();
    }

}

-概念(之后还会有别的设计模式)

单例模式是设计模式中最简单的一种,但是它没有设计模式中的那种各种对象之间的抽象关系,所以有人不认为它是一种模式,而是一种实现技巧.单例模式就像字面的意思一样,提供一个只能自己实例化的实例,并且提供了一个全局的访问点.要达到这几点要求就要满足三点:私有构造函数(防止被别人实例化),静态私有自身对象(用来提供实例),静态公有的getInstance方法(用来创建和获取实例对象).

优缺点: 单例只允许自己建立一个实例,不需要频繁创建和销毁,可以节省内存加快对象的访问速度.
但是单例没有抽象层和接口,不方便扩展.单例既提供工厂方法又提供业务方法,一定程度上违背了单一职责原则

-单例实现
单例的实现有两个主流方式,分别是懒汉模式和饿汉模式,他们在实例化的时机和效率方面各有不同

懒汉模式:懒汉模式在外部对象每次获取实例时都要先判断该实例是否被初始化,这点相比饿汉模式来说就会损失一些效率,但是会节省一些空间,因为什么时候用到该实例才会去初始化,如果一直用不到的话,在懒汉模式里面时不会构造该对象的.相当于用空间换时间.也就是延迟加载技术.还有一点需要注意的是一定要有私有构造,要不然外部对象还是可以实例化该对象,那还谈何单例.

饿汉模式:饿汉模式是在系统运行起来,在装在类的时候就进行初始化的操作,外部对象使用的时候不需要做任何判断可以直接使用,从效率上来说是优于懒汉模式的.但是对比懒汉模式的延迟加载技术,不管系统用不用该实例,内存都会在最开始的时候创建出来.跟懒汉的时间换空间正好相反,饿汉是空间换时间.

概念的东西,更多的可以看:http://www.iteye.com/topic/575052

然后就是我们的一个自定义Toasat(陷入这个表情无法自拔,哈哈)

public class ToastUtils {
    private static ToastUtils instance;

    private ToastUtils(){}

    public static ToastUtils getInstance(){
        if (instance == null) {
            instance = new ToastUtils();
        }
        return instance;
    }

    public  void show(Context context, String text, boolean isLong) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View layout = inflater.inflate(R.layout.toast_layout, null);

        ImageView image = (ImageView) layout.findViewById(R.id.toast_image);
        image.setImageResource(R.drawable.icon);

        TextView textV = (TextView) layout.findViewById(R.id.toast_text);
        textV.setText(text);

        Toast toast = new Toast(context);
        toast.setGravity(Gravity.CENTER, 0, 550);
        toast.setDuration((isLong) ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
        toast.setView(layout);
        toast.show();
    }
}

Toast效果:

这里写图片描述

其他工具类的运行效果:

这里写图片描述

源码地址:https://github.com/ddwhan0123/SoyiGit/tree/master/Soyi

点个Star,谢谢。你的支持是我的动力!

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值