设计模式
是一套反复使用,多数人知晓的,经过分类的代码设计的总结。其目的是为了代码更容易被他人理解,保证代码可考性,设计模式使代码真正的工程化,设计模式是软件工程的基础之路。
设计模式一般分为三种大的类型:
创建型模式,如单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式等等。
结构型模式,如适配器模式,桥接模式,装饰模式,组合模式,外观莫欧式,代理模式等等。
行为型模式,如模板模式,命令模式,迭代模式,状态模式,观察者模式等等。
单例模式(singleton):
定义:单例对象的类只允许一个实例存在。
创建规则:私有构造器,将其本身作为静态的私有的属性添加到类上。通过静态方法得到类的实例。
创建单例模式有很多方法。如:饿汉式,静态代码块创建,调用静态方法,判断是否为null,双重检查,静态内部类,枚举等方式。
推荐使用双重检查:
public class Singleton{
private static volatile Singleton singleton;
private Singleton(){};
prvate static Singleton getInstancte(){
if(singleton==null){
syschronized(Singleton.class){
if(singleton==null)
singleton=new Singleton();
}
}
}
}
进行两次if检查,可以保证线程安全。优点:线程安全,延迟加载,效率较高。
单例模式使用的场景:
需要频繁的创建和销毁的对象;
创建对象时耗时过多,或者资源消耗过多的时候;
工具类对象;
频繁访问数据库或者文件的对象。
工厂模式
最常用的实例化对象的模式,用工厂方法替代new 操作。(如BeanFactory ,sqlSessionFactory等)
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,使其创建过程延迟到子类。
优点:工厂方式为系统提供了非常灵活的强大的动态扩展机制。修改实现类就修改其很多读东西。
使用场景:日志记录(内存,硬盘,移动硬盘),数据库访问(访问不同的数据库),连接服务器的框架等等。
(因为生产的子类不同,且子类有不同的子类,把上层的转化为抽象类,实现类完成工厂生产,就是抽象工厂模式)
建造者模式
使用多个简单的对象一步一步构建一个复杂的对象,提供了一种创建对象的最佳方式。
意图:将一个复杂的构建与其表示相分离,使得同样鹅构建过程,创建不同的表示。
使用场景:需要生成对象有复杂的内部结构,生成的对象内部属性本身相互依赖。
优点:建造者模式用在构件的装配方面,如果通过不同的组件或者相同的组件不同的顺序,可以产生出一个新的对象,它可以产生一个非常灵活的架构,方便的扩展和维护系统。
抽象工厂模式和建造者模式的区别。
抽象工厂模式关注生产产品的整体。建造者模式更加关注对象构建的过程。
希望屏蔽对象的创建过程,只提供一个封装良好的对象,使用抽象工厂模式。
模板模式
一个抽象类公开定义了执行它的方法,它的子类可以按照要求,重写方法实现,但调用将以抽象类中的定义方式进行。
意图:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。
优点:封装不变的部分,扩展可变的部分,提取公共代码,便于维护,行为由父类控制,子类实现。
使用场景:有多个子类共有的方法且逻辑相同,重要的,复杂的方法,一般这上面加final修饰,防止篡改。
代理模式
一个类代表另外一个类的功能。为某些对象提供一个代理,可以控制这个对象的访问。
优点:职责清晰,高扩展性,智能化。
使用场景:按职责分;远程代理,虚拟代理,保护代理,日志代理等等。
设计模式代表了现阶段的最强实践,是软件开发人员长时间实验和错误总结出来的。