设模-单例

什么是设计模式?
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

设计模式的好处
模式是在某一背景下某个问题的一种解决方案。
1. 复用解决方案——通过复用已经公认的设计,我能够在解决问题时取得先发优势,而且避免重蹈前人覆辙。我可以从学习他人的经验中获益,用不着为那些总是会重复出现的问题再次设计解决方案了。
2. 确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。
3. 提高观察高度--模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角,这将使我们从“过早处理细节”的桎梏中解放出来。
4. 大多数设计模式还能使软件更容易修改和维护。其原因在于,它们都是久经考验的解决方案。所以,它们的结构都是经过长期发展形成的,比新构思的解决方案更善于应对变化。而且,这些模式所用代码往往更易于理解——从而使代码更易维护。


一个人的技术水平的高低,整个项目的分层架构,代码的书写规范程度,以及代码的性能程度,足矣体现出来。不是会几个特效的制作,就说技术水平高,但系也不能全盘否定。

单例模式定义:

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

单例模式应用场景:
确保某一个类只有一个对象,避免产生多个对象小号过多的资源,或这个某种类型得对象只应该有一个。例如(访问IO,数据库的资源等等)


单例的其他方式:
懒汉模式是声明一个静态对象,并且在用户第一次调用getInstance时进行初始化的。

public class Singleton {
    private static Singleton instance;

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
这个单例添加了这个synchronized 关键字,这个是一个同步方法,每次用getInstance(),都会进行同步,这样会小号不必要的资源。(不建议使用的单例模式)。

Double CheckLock(DCL)实现单例。

public class Singleton {
    private volatile static Singleton instance;

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }

        }
        return instance;
    }
}

推荐使用的单例。
进行双层判空。第一次判空,主要为了避免不必要的同步,第二次判空,主要为了在null的·情况下创建实例。,然后使用关键字volatile ,保证每次读取都在·主内存中读取。
Android中的fragment使用的单例。

package com.example.drawdemo;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class SingleFragment extends Fragment {
    private static SingleFragment instance = null;

    private SingleFragment() {
    };

    public static SingleFragment getFragment() {
        if (instance == null) {
            synchronized (SingleFragment.class) {
                if (instance == null) {
                    instance = new SingleFragment();
                }
            }

        }
        return instance;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        return super.onCreateView(inflater, container, savedInstanceState);
    }
}

基本一看就会了的单例,实在太简单了,不多说。

静态内部类实现单例

public class Singleton {
    private Singleton() {
    };

    public static Singleton getInstance() {
        return SingletonHolder.sInstance;
    }

    private static class SingletonHolder {
        private static final Singleton sInstance = new Singleton();
    }

}

枚举单例

public enum Singleton {
    INSTANCE;
    public void doSomething() {
        System.out.println("do sth");
    }
}

容器单例


import java.util.HashMap;
import java.util.Map;

import android.support.v4.app.Fragment;

public class FragmentFactory {
    private static Map<String, Fragment> objMap = new HashMap<String, Fragment>();
    private FragmentFactory() {

    };
    public static Fragment getFragment(String key, Fragment fragment) {
        if (!objMap.containsKey(key)) {
            objMap.put(key, fragment);
            return fragment;
        } else {
            return objMap.get(key);
        }

    }
}

通过管理类fragment实现单例模式。
基本上单例模式也是这样,比较简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值