设计模式主要有23种,大致可分为三类:创建型,机构行,行为型;具体如下:
创建型
1,单例设计模式2,工厂设计模式3,建造者设计模式4,原型设计模式
结构型
5,代理设计模式6,桥接设计模式7,装饰设计模式8,适配器设计模式9,外观设计模式10,享元设计模式11,组合设计模式
行为型
12,模板设计模式
13,观察者模式
14,策略设计模式
持续更新中...
简介
单例设计模式(Singleton Design Pattern)解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。
实现单例一般要考虑的条件:
1,构造函数用 private 修饰,访问权限的,避免外部通过 new 创建实例(对象);
2,考虑对象创建时的线程安全问题;
3,考虑是否支持延迟加载;
4,考虑 getInstance() 性能是否高(是否加锁)。
实现方式
实现单例方式:饿汉式,懒汉式,双重检测,静态内部类,枚举;
1,饿汉式
public class Setting {
private static final Setting mSetting= new Setting();
private Setting() {
}
public static Setting getInstance() {
return mSetting;
}
}
缺点:在类加载的时候,mSetting静态实例就已经创建并初始化完成;不支持延迟加载(在需要的时候在创建单例对象)
优点:mSetting实例的创建过程是线程安全的(在类加载的期间,就已经将 mSetting静态实例初始化好了,所以,mSetting实例的创建是线程安全的)
2,懒汉式
public class Setting {
private static Setting mSetting;
private Setting() {
}
public static synchronized Setting getInstance() {
if (mSetting == null) {
mSetting = new Setting();
}
return mSetting;
}
}
缺点:getInstance()加了锁,如果频繁的调用的话效率很低(每次调用加锁,释放锁)导致并发度很低,为1;
优点:可以延迟加载;
3,双重检测
public class Setting {
private static Setting mSetting;
private Setting() {
}
public static Setting getInstance() {
if (mSetting == null) {
synchronized (Setting.class) {
if (mSetting == null) {
mSetting = new Setting();
}
}
}
return mSetting;
}
}
优点:既可以懒加载,也支持高并发
4,静态内部类
public class Setting {
private Setting() {
}
private static class SettingHolder{
private static final Setting mSetting = new Setting();
}
public static Setting getInstance() {
return SettingHolder.mSetting;
}
}
优点:保证线程安全的同时,又作到了延迟加载;当Setting类加载的时候并不会创建静态内部类SettingHolder,只有调用getInstance()的时候才被加载;mSetting的唯一性、创建过程的线程安全性,都由 JVM 来保证;
5,枚举
public enum Setting{
INSTANCE
}
总结:以上五种实现方式都是线程安全的;