21种设计模式整理(1)---单例

来源:互联网 发布:mysql添加主外键约束 编辑:程序博客网 时间:2024/06/07 02:39

以前的编程是面向过程的编程,数据结构跟算法是组成他们的基本元素。所以我一直认为数据结构与算法的学习,有利于我实现底层功能,这是编程的内功。

但现在都是面向对象的编程,需求已经转变为易于维护,易于扩展,易于理解,冗余降低,降低耦合。我认为i这些的问题的本质就是编程过程中如何设计程序。而其中的基础,我认为应该是设计模式。高一层次就是框架。

        一种设计模式就代表着一种需求,一种解决办法的思想,这些都是前辈们在多次遇到问题,然后解决问题得出来的经验,所以如果想站在前人的肩膀上,这些设计模式是必须要精通的。不过想精通这些,绝对不是我说的这样看看,练练代码就能成功的,这需要在以后自己的项目中去长期实践,才能真正的感受的他们的优点,缺点,用处。我在这个行业对自己提醒的一句话就是:只有学习到了思考方式才是真正的学到了一门技术。

对每一个设计模式,我都应该问自己:为什么会出现这种模式,这种设计模式有什么优点,什么缺点,对于面向对象的编程有什么好处,又有什么需要特别注意的地方。可惜的是,我现在只是刚刚接触的阶段,只能理解到很肤浅的知识。不过,我还是希望通过对这些设计模式的整理,来让自己对于设计模式框架有一个大体的把握,在以后的开发过程中才能进行比较。

今天只说一个最简单也是最常用的设计模式:单例设计模式。

单例在开发中常常遇到。当某一个类,我们希望他在内存中只存在一个实例对象时,我们就需求与单例设计了。

例的实现方法很多,比较基本的思路是将构造函数私有化,这样,外部就不能创建新的实例了。使用一个静态成员变量用于保存一个实例对象,一种获取方式是通过一个类的静态的公有方法将这个成员变量返回,通常命名为getInstance。


         这种方式又分俗称的“懒汉式”和“恶汉式”两种。

         懒汉式就是类加载的时候就创建了对象。而饿汉式则是在第一次需要时才创建实例。

          懒汉式实现简单,该静态成员变量直接初始化为一个新实例,但是未使用前,内存就有所消耗。

         而饿汉式,静态成员初始化为null,通过对它进行是否为null的判断,为空则创建新的对象,但需要考虑线程安全问题:一种方式是对getInstance进行同步,但每次获取对象都需要同步会降低性能(第一次创建对象之后都只是获取同一对象,不需要同步了)。另外一种方式是首先判断是否为null,是的话才进入新建实例的同步代码块(未避免多线程同时进入了此代码块,导致多次创建对象,可以在新建实例之前,再次判断是否为null),这样如果不为空则不需要使用同步。


由于枚举具有以上的性质:构造函数私有。所以单枚举也可以实现单实例。


以上的实现优点是实现较简单,对象的管理有该类来管理。不过只要对象被创建出来,则由于有静态成员指向它,所以后期,这个对象会一直存在。


public class SingleCase {/**懒汉式**/public static class Case1{/**实例 持有者**/private static Case1 handle=new Case1();//私有化构造函数private Case1() {}public static Case1 getInstance() {return handle;}}/**饿汉式**/public static class Case2{/**实例 持有者**/private static Case2 handle=null;//私有化构造函数private Case2() {}public static Case2 getInstance() {if(handle==null) {//第一步检查synchronized (handle) {if(handle==null) {//防止多个线程同时通过了第一步的检查 handle=new Case2();}}}return handle;}}/**枚举,较少用**/public enum Case3{Inastance;}public static void main(String[] args) {Case1 case1=Case1.getInstance();Case2 case2=Case2.getInstance();Case3 case3=Case3.Inastance;}}


0 0