文章目录
设计模式的原则
1、单一职责原则
2、开闭原则
3、里氏代换原则
4、依赖倒转原则
5、接口隔离原则
6、合成/聚合复用原则
7、迪米特法则
一、创建型模式
1、单列模式
(1)核心作用
– 由于单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要 比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动 时直接产生一个单例对象,然后永久驻留内存的方式来解决
– 单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计 一个单例类,负责所有数据表的映射处理
(2)应用场景
-Windows的Task Manager(任务管理器)就是很典型的单例模式
– windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
– 项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。
– 网站的计数器,一般也是采用单例模式实现,否则难以同步。
– 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作 ,否则内容不好追加。
– 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。
– 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
– Application 也是单例的典型应用(Servlet编程中会涉及到) – 在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理
– 在servlet编程中,每个Servlet也是单例 – 在spring MVC框架/struts1框架中,控制器对象也是单例
(3)常见的五种单例模式实现方式
饿汉式
/**
* 测试饿汉模式单例模式
* 线程安全,调用效率高。 但是,不能延时加载。
* @author
*
* */
public class SingletonDemo1 {
//类初始化时,立即加载这个对象(没有延迟加载的优势),加载类时,线程安全
private static SingletonDemo1 instance =new SingletonDemo1();
//私有构造器
private SingletonDemo1(){}
//方法没有同步,调用效率高
public static SingletonDemo1 getInstance(){
return instance;
}
}
懒汉式
/**
* 测试懒汉式单例模式
* 线程安全,调用效率不高。 但是,可以延时加载。
*
* */
public class SingletonDemo2 {
//类初始化时,不初始化这个对象(延迟加载,真正用的时候再创建)
private static SingletonDemo2 istance ;
//私有构造器
private SingletonDemo2(){}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if( istance == null){
istance = new SingletonDemo2();
}
return istance;
}
}
双重检查锁式模式
/**
* 测试懒汉式单例模式
* @author
*
* */
public class SingletonDemo3 {
//[1]对象锁
private static SingletonDemo3 intance ;
public static SingletonDemo3 getInstance(){
if( intance == null){
SingletonDemo3 sc;
// synchronized方法锁
synchronized(SingletonDemo3.class){
sc = intance;
if(sc == null){
synchronized(SingletonDemo3.class){
if(sc == null){
sc = new SingletonDemo3();
}
}
intance =sc;
}
}
}
return intance;
}
private SingletonDemo3(){}
}
静态内部类式
枚举单例
2、工厂模式
(1)作用
实现了创建者和调用者的分离。
(2)核心本质
– 实例化对象,用工厂方法代替new操作。
– 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实 现类解耦
(3)3种方式
简单工厂模式
用来生产同一等级结构中的任意产品。
工厂方法模式
用来生产同一等级结构中的固定产品。
抽象工厂模式
用来生产不同产品族的全部产品。
应用场景
– JDK中Calendar的getInstance方法
– JDBC中Connection对象的获取
– Hibernate中SessionFactory创建Session
– spring中IOC容器创建管理bean对象
– XML解析时的DocumentBuilderFactory创建解析器对象
– 反射中Class对象的newInstance()
3、建造者模式
(1)本质
– 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。 从而可以构 造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用
(2)场景
– StringBuilder类的append方法
– SQL中的PreparedStatement
– JDOM中,DomBuilder、SAXBuilder