设计模式:
在软件开发中,经过大家公认的,用于在特定环境下特定问题的解决方案,不是具体的代码,而是实际情景中的解决方案。
几乎所有模式有以下面向对象原则:
1.对接口编程而不是对实现编程
面向接口编程:解耦,增强扩展性
2.优先使用对象组合而不是继承
设计模式的三大类:创建型模式,结构型模式,行为型模式
何为创建型模式:
把复杂对象的创建过程加以抽象,通过子类继承和重写方法,来得到具有复合属性的对象。
单例模式:
一个对象只有一个实例,如:数据库操作,线程池,配置文件等等,属于全局资源。
有以下特点:
1,一个单例类只能有一个实例;
2,必须自己创建实例,使用时不需要考虑创建细节
3,单例类向整个系统提供唯一的实例;
优点:有利于节约内存空间,为整个框架提供共享变量,提高代码的重用性
运用场景:
1,资源共享的情况下,避免由于资源操作时导致的性能或损耗,如配置文件;
2,控制资源的情况下,方便资源的互相通信,如线程池;
单例模式的几种实现方式:饿汉式,懒汉式,双重验证式,类加载式,枚举式;
饿汉式:
代码:
package org.yl; /** * Created by yelei on 17-4-7. */ //饿汉式 public class SingletonClass { private static SingletonClass ONE=new SingletonClass(); //私有构造器,只能类部访问,不能被实例化和继承 private SingletonClass(){} //通过这个方法返回实例 public static SingletonClass getInstance(){ return ONE; } /* public void show(){ System.out.println("饿汉式"); }*/ }
测试类:
package org.yl; /** * Created by yelei on 17-4-7. */ public class Test { public static void main(String[] args) { SingletonClass a=SingletonClass.getInstance(); SingletonClass b=SingletonClass.getInstance(); Z z1=new Z(); Z z2=new Z(); if (a==b){ System.out.println("a==b"); } if (z1!=z2){ System.out.println("z1!=z2"); } } }
运行结果:
a==b z1~=z2 Process finished with exit code 0
饿汉式的优点:不存在线程安全;
缺点:项目已启动就创建,不能控制其创建的时间,也就是不能延迟创建。
懒汉式:
代码:
package org.yl; /** * Created by yelei on 17-4-7. */ //饿汉式 public class SingletonClass { //这里先不创建实例 private static SingletonClass ONE; //私有构造器,只能类部访问,不能被实例化和继承 private SingletonClass(){} //通过这个方法返回实例 public static SingletonClass getInstance(){ //先判断是否已经创建了实例 if (ONE==null){ ONE=new SingletonClass(); } return ONE; } /* public void show(){ System.out.println("饿汉式"); }*/ }
测试代码和运行结果和前面一致;
饿汉式的优点:可以延迟创建对象,缺点是会存在线程安全问题,所以有加锁的懒汉式:
public synchronized static SingletonClass getInstance(){ //先判断是否已经创建了实例 if (ONE==null){ ONE=new SingletonClass(); } return ONE; }
加锁饿汉式的优点可以解决线程安全问题,但是同步效率低,每次使用ONE都必须同步等待。