设模-单例

2019-04-13 14:38发布

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) { // 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 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实现单例模式。
基本上单例模式也是这样,比较简单。