class="markdown_views prism-atom-one-light">
什么是设计模式?
设计模式(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) {
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 objMap = new HashMap();
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实现单例模式。
基本上单例模式也是这样,比较简单。