1.软件设计模式的概念
软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。
2. 设计模式分类
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
3.单例设计模式
1.单例设计模式
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。在程序中多次使用同一个对象且作用相同的时候,为了防止频繁的创建对象,单例模式可以让程序在内存中创建一个对象,让所有的调用者都共享这一单例对象
2.单例模式的结构
单例模式的主要有以下角色:
单例类。只能创建一个实例的类.
访问类。使用单例类
3.单例模式类型
饿汉式:在类加载的时候已经创建好该单例对象
懒汉式:在需要使用对象的时候才会去创建对象
4.单例模式的实现
饿汉式
步骤如下:
1)构造器私有化(防止new )
2)类的内部创建对象
3)向外暴露一个静态的公共方法。getInstanc
4)代码实现:
class Singleton {
//1.构造器私有化,只能在内部new对象
private Singleton(){
}
//2.内部实例化
private final static Singleton instance =new Singleton();
//3.提供get方法供外部使用,返回实例对象
public static Singleton getInstance(){
return instance;
}
}
优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
懒汉式:
class Singleton{
private Singleton(){
}
private static Singleton instance;
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
效率低
比如当单例创建好之后,此时不会存在任何线程安全问题,但是每次访问仍然要加锁。导致效率低下。
双重检查:
class Singleton{
private Singleton(){}
//volatile确保INSTANCE每次均在主内存中读取,这样虽然会牺牲一点效率,但也无伤大雅。(JDK1.5之后)
private static volatile Singleton instance;
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
使用双重检测同步延迟加载去创建单例的做法是一个非常优秀的做法,其不但保证了单例,而且切实提高了程序运行效率。
Double-Check概念是多线程开发中常使用到的,我们进行了两次if (singleton == null)检查,
这样就可以保证线程安全了。这样,实例化代码只用执行一次,后面再次访问时,判断 if (singleton ==- null),直接return实例化对象,也避免的反复进行方法同步.
线程安全;延迟加载;效率较高
5. 单例模式优点和缺点
优点:单例类只有一个实例,节省了内存资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;单例模式可以在系统设置全局的访问点,优化和共享数据,例如前面说的Web应用的页面计数器就可以用单例模式实现计数值的保存。
缺点:单例模式一般没有接口,扩展的话除了修改代码基本上没有其他途径。