Java学习笔记

《每天进步一点点》DAY7: 常用设计模式

2016-12-23  本文已影响55人  Vivi成长吧

单例模式

//饿汉式(声明静态对象时就初始化对象)
public class Singleton
{
    // 1,私有构造函数
    private Singleton()
    {
    }

    // 2,创建本类对象
    private static Singleton mInstance = new Singleton();

    // 3,对外提供公共的访问方法
    public static Singleton getInstance()
    {
        return mInstance ;
    }
}

//懒汉式,单例的延迟加载模式(线程不安全)
public class Singleton
{
    // 1,私有构造函数
    private Singleton()
    {
    }

    // 2,声明一个本类的引用
    private static Singleton s;

    // 3,对外提供公共的访问方法
    public static Singleton getInstance()
    {
        if (s == null)
        {
            // 线程1,线程2...多线程时可能会创建多个对象
            s = new Singleton();
        }
        return s;
    }
}

多线程安全,但是效率低:
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  

// 每次调用都同步,这样会消耗不必要的资源
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}
            
双重锁定:
public class Singleton
{
    // 1,私有构造函数
    private Singleton()
    {
    }

    // 2,声明一个本类的引用
    private static Singleton s;

    // 3,对外提供公共的访问方法,加锁,解决多线程同时访问会创建多个对象的问题
    public static Singleton getInstance()
    {
        if (s == null)
        {
            synchronized (Singleton.class)
            {
                if (s == null)
                {
                    s = new Singleton();
                }
            }
        }
        return s;
    }
}

public class Singleton {
    private Singleton() {}
    
        private static class SingletonHolder 
       {        
         private static final Singleton INSTANCE = new Singleton();
       }
      public static Singleton getInstance()
      {
              return SingletonHolder.INSTANCE;
      }
}
这种方式,第一次加载Singleton这个类时,不会加载SingletonHolder。只有第一次调用 getInstance()时才会初始化实例INSTANCE。即保证了线程安全,也保证了单例对象的唯一性,同时也延迟了单例的初始化,是推荐使用的单例模式实现方式。

简单工厂模式

举例:


class AnimalFactory {
    private AnimalFactory() {}

    public static Animal createAnimal(String animalName) 
    {
        if(“dog”.equals(animalName)) 
        { 
            return new Dog();
        }
        else if(“cat”.equals(animale))
        {
            return new Cat();
        }else 
        {
            return null;
        }
    }
}

工厂方法模式

适配器模式

装饰模式

代理模式

上一篇 下一篇

猜你喜欢

热点阅读