最近写项目写的有点心累,写上几篇设计模式缓解下心中的烦躁。

  

首先要明白,什么是设计模式?

设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。

         这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。


Android的设计模式分为三大类:

1)创建型模式:

单例模式,抽象工厂模式,工厂模式,原型模式,建造者模式。

2)结构型模式:

适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式。


3)行为型模式:

观察者模式,中介者模式,访问者模式,解释器模式,迭代器模式,备忘录模式,责任链模式,状态模式,策略模式,命令模式,模板模式。


今天我们先来探讨一下设计模式中最常用的单例模式。

创建型模式一 单例模式:

 使用场景:确保一个类在在内存中只有一个实例,并向全局提供这个实例。

     单例模式分为 懒汉式 ,饿汉式 ,登记式。

    

     懒汉式:在需要的时候,才会创建出本类对象。不需要就不创建。只会创建一次

        饿汉式:在程序一开始就创建出本类对象。只会创建一次。

       登记式:实际对一组单例模式进行的维护,通过map我们把单例存进去,

                             这样在调用时,先判断该单例是否已经创建,

                             是的话直接返回,

                             不是的话创建一个登记到map中,再返回。


在这里首先讲解下懒汉式。

按照惯例,写一个小Demo。

public class Demo {

    private static Demo demo = null;
    
    private Demo() {

    }
    
    public static Demo getInstance(){
        if(demo == null){
            synchronized (Demo.class){
                if(demo == null){
                    demo =  new Demo();
                }
            }
        }
        return demo;
    }
}

        首先,我们把Demo这个类的构造方法private修饰起来。

 这样在外部就无法通过new关键字创建出Demo的对象。   

        提供一个本类对象的静态成员变量demo。


        然后提供一个公共的静态的方法 getInstance() 获取本类实例。


        因为静态变量会在编译时就已经存在于静态区。属于一个全局变量。不会随着对象的创建而创建。

        所以我们声明一个静态的成员变量demo 用来记录本类对象是否被创建过。


        在这个方法中进行判断,

            如果demo ==null 就创建出本类的实例,赋值给demo。

demo即可。

        但是注意!

                如果多个线程同时访问该类对象,会造成同时创建多个对象。

                所以我们需要加上 synchronized 关键字来锁住这个类。

                多个线程同时访问,会按照先后顺序进行执行。

                所以不会创建出多个对象。

          在进行同步锁之后,我们还要再一次进行判空,

          因为同一时间所有的线程都会在同步锁外部进行等待,但是它们已经进行了第一次判空。

          如果不加上第二次判空,还是让这些对象先后顺序创建出多个对象。

          所以我们需要再次加上一个内部的判空。

          这样就真正意义上做到了单例模式。

            

    饿汉式这里就不进行过多介绍了,直接上代码

public class Demo {

    private static Demo demo = new Demo();

    private Demo() {

    }

    public static Demo getInstance(){
        return demo;
    }
}

登记式:

说白了 就是使用Map集合中管理多个单例模式。
代码就不进行书写了。

单例模式使用的很广泛。、任何一个类不让他有多个实例,都可以让他进行单例模式。

常见的比如网络请求的

。Retrofit+Rxjava

。数据库GreedDao

    单例模式可以保证这些对象的高并发性完美的体现,极大的减少了内存开销。

   

注意:在开发中是不允许存在太多的静态变量和静态方法。因为会存在强引用造成内存溢出。

对于那些比较耗内存的类,只实例化一次可以大大提高性能,尤其是在移动开发中。


        可能一个程序开发中,这个类不在首页。用户不需要一进来就加载这个类。

        这种情况下我们就需要懒汉式。 让我们没有用到时候不加载对象。    


        但是可能这个类需要加载的时间很长。当用户进行交互的时候在进行加载会有卡顿现象。

        这种情况下用户体验就很差,我们就需要使用到饿汉式。让我们的对象在一开始就加载完毕。

        

看完记得个赞,都不容易。