设计模式
- 设计模式共有23种,他是一种程序设计的思路,只要是面向对象语言,比如C#等其他的语言,都存在设计模式,代码不同,但是思路都是通的。
- 设计模式的分类:
- 主要学习单例模式和工厂模式。
单例模式
总结:
一句话总结:一个类在Java虚拟机中只有一个对象,并提供一个全局访问点。
生活中例子:太阳、月亮、国家主席等。
解决什么问题:对象的唯一性,性能浪费太多。
项目里面怎么用:数据库连接对象,属性配置文件的读取对象。
模式结构:分为饿汉式和懒汉式(如果考虑性能问题的话,就使用懒汉式,因为懒汉式是在方法里面进行初始化的),构造器私 有化,对外提供方法加同步关键字。
框架里面使用:Struts1的Action。
JDK里面使用:java.lang.Runtime#getRuntimejava.awt.Desktop#getDesktop。
1. 单例模式的核心作用是什么?
- 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
2. 单例模式的常见应用场景?
- 在项目种加载配置文件的类,一般也只是一个对象,没有必要重复加载。
- 一个项目种的数据库连接池,设计的时候一般是单例模式。因为数据库连接是一种数据库资源,保证提供一个对象来访问数据库资源。每次都new的话,很消耗资源。
- 在Spring种,每个bean默认就是单例的,这样做的优点是spring容器可以管理。
- springmvc中,控制器对象也是单例。
- 在serviet编程种,每个servlet也是单例。
3. 单例模式的优点?
- 单例模式只生成一个实例,减少了系统的开销。
- 单例模式可以在系统设置全局的访问点,优化共享资源的访问,例如设计一个单例类,负责所有数据表的映射处理。
4. 常见的主要的单例模式?
- 饿汉式:线程安全,调用效率高,但是,不能延时加载。
- 懒汉式:线程安全,调用效率不高,但是,可以延时加载。
- 静态内部类式:线程安全,调用效率高,但是,可以延时加载。
- 双重检测锁(由于jvm底层内部模型原因,偶尔出问题,不建议使用)
- 枚举单例:线程安全,调用效率高,不能延时加载。
5. 单例模式如何实现?
- 构造器私有。
- 提供一个私有的静态对象。
- 提供一个公共的静态方法,返回该对象。
6. 懒汉式和饿汉式的区别?
- 首先他俩的都是线程安全的。但是实现线程安全的方式不同,饿汉基于 classloder 机制避免了多线程的同步问题,懒汉方法加了同步锁。
- 饿汉没有延时加载,懒汉有延时加载。
- 饿汉没有同步锁,执行效率高于懒汉。
- 饿汉在类加载时就创建对象,浪费内存,资源消耗高于懒汉。
- 如果类的创建时代价很高,推荐使用懒汉式,节省资源,但是调用效率低。如果类的调用效率高,推荐使用饿汉式。
package com.aaa.test;
/**
* 饿汉式
* @author admin
*
*/
public class SingletonDome {
//私有的静态方法,当类加载时就创建对象。
private static SingletonDome s = new SingletonDome();
/**
* 私有构造
*/
private SingletonDome() {
}
/**
* 公共的全局的方法
* @return
*/
public static SingletonDome getIntance(){
return s;
}
}
/**
* 懒汉式
* @author admin
*
*/
public class SingletonDome1 {
//当类加载时,不创建对象,判断后在创建
private static SingletonDome1 s;
/**
* 私有的构造方法
*/
private SingletonDome1() {
}
/**
* 加上同步锁,保证线程安全。
* @return
*/
public static synchronized SingletonDome1 getInstance(){
if(s==null){
s = new SingletonDome1();
}
return s;
}
}
工厂模式
总结:
一句话总结:用一个方法来代替new关键字
生活中的例子:制衣厂、面包厂等生产厂。
解决什么问题:对象产生过多,或者经常有子类替换生成。
项目里面怎么用:对于经常生成的对象,或者父子类替换的对象。
模式结构:写一个对外声明的方法,方法里面使用new关键字代替。
框架里面使用:spring的核心就是工厂模式。
JDK里面使用:newInstance。
1. 什么是工厂模式?
- 工厂模式就是帮我们实例化对象的,实现创建者和调用者分离。
2. 工厂模式的特点?
- 分工,专业的人干专业的事。
3. 主要基本原则
- 一共有六个。
- 开闭原则:一个软件的实体应当对扩展开放,对修改关闭。
- 依赖倒转原则:面向接口编程,不要针对实现编程。
- 迪米特法则:只要你直接的朋友通信,而避免和陌生人通信。解耦。
4. 工厂模式分类
- 简单工厂模式:用来生产同一等级结构中的任意产品。
- 工厂方法模式:用来生产统一等级结构中的固定产品。
- 抽象工厂模式:又来生产不同产品族的全部产品。
5. 工厂模式的应用
- spring的核心就是工厂模式
6. 工厂模式用来解决什么问题。
- 对象产生过多,或者经常有子类替换生成。解耦和。
代理模式
总结
一句话总结:为其他对象提供一个代理,以控制对当前对象的访问。
生活中的例子:房屋中介、婚姻介绍所。
解决什么问题:不能直接访问该对象,或者太大的资源耗费多。
项目里面怎么用:权限,或者大对象的访问权限。
模式结构:代理类和被代理类实现同一个接口,用户访问的时候先访问代理对象,然后让代理对象去访问被代理对象。
框架里面使用:Spring里面的AOP实现。
JDK里面使用:java.lang.reflect.Proxy。