常见的设计模式
什么是设计模式
前人开发过程总结出来,一套开发代码优秀实践,被总结提炼处理成为一种开发代码模式。我们使用这些模式能让我们代码可读性更高、效率更高。
创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。
结构型模式:把类或对象结合在一起形成一个更大的结构。
行为型模式:类和对象如何交互,及划分责任和算法。
常见的设计模式
单例模式
什么是单例模式?保障一个类只能有一个对象(实例)的代码开发模式就叫单例模式
什么时候使用? 工具类!(一种做法,所有的方法都是static,还有一种单例模式让工具类只有一个实例) 某类工厂(SqlSessionFactory)
饿汉式
java
public class _01JdbcUtil {
//1 构造方法私有化,保证只有自己类能够创建
private _01JdbcUtil(){
}
//2 创建一个private对象
private static final _01JdbcUtil INSTANCE = new _01JdbcUtil();//这个地方就体现饿汉,一来就创建对象给他
//3 提供一个static方法来获取你的这个单实例对象
public static _01JdbcUtil newInstance(){
return INSTANCE;
}
//普通方法
public String getConnection(){
return "I am connection!";
}
}
懒汉式
java
public class _02JdbcUtil {
//1 构造方法私有化,保证只有自己类能够创建
private _02JdbcUtil(){
}
//2 创建一个private对象
private static _02JdbcUtil INSTANCE;
//3 提供一个static方法来获取你的这个单实例对象
//方案1:方法锁,里面还有业务逻辑
//public static synchronized _02JdbcUtil newInstance(){
public static _02JdbcUtil newInstance(){
//方案2:锁代码块
//synchronized (_02JdbcUtil.class){ // 100个线程哪怕有一个已经创建了也要排队
if (INSTANCE==null){
//多线程来了? T1 T2
synchronized (_02JdbcUtil.class){
if (INSTANCE==null){
INSTANCE = new _02JdbcUtil();
}
}
}
//}
//此处有10W行代码....
return INSTANCE;
}
//普通方法
public String getConnection(){
return "I am connection!";
}
}
枚举
java
/**
* 枚举:让它只有一个实例就是单例
*/
public enum _03JdbcUtil {
INSTANCE;
/**
* 普通方法
* @return
*/
public String getConnection(){
return "I am connection!";
}
}
工厂模式
java
import java.util.Properties;
/**
* 传入对象字节码就能创建一个对象
*/
public class ObjectFactory {
/**
* 对象工厂
* @param clazzkey
* @return
*/
public static Object getObject(String clazzkey){
try {
Properties properties = new Properties();
properties.load(ObjectFactory.class.getClassLoader().getResourceAsStream("beans.properties"));
String clazzName = properties.getProperty(clazzkey);
if (clazzName==null || "".equals(clazzName))
return null;
return Class.forName(clazzName).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
Spring概述
什么是Spring
Spring是一个开源的轻量级控制反转(IOC)和面向切面编程(AOP)的容器框架;
-
轻量级:相对于重量级(框架设计比较繁琐,配置较多,例如EJB(tomcat不支持),现在基本不用了)而言,开发使用都比较简单,功能强大;
-
IOC(Inverse of control - 控制反转):将创建对象的权利和依赖关系维护(字段赋值)交给Spring容器(不再使用以前new关键字创建对象)。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被Spring控制,所以这叫控制反转;
java<beans> <bean id="employeeDao" class="...EmployeeDaoImpl"> </beans>
-
AOP(Aspect Oriented Programming):将相同的逻辑抽取出来,即将业务逻辑从应用服务中分离出来。然后以拦截的方式作用在一个方法的不同位置。例如日志,事务的处理; 注意事项:Spring底层原理:xml+dom4j+工厂设计模式+反射
-
spring一个j2ee框架,主要有两个核心,第一个是ioc或Di,就是把我们的对象交给spring管理,并且有依赖关系是会自动注入。第二个是aop,面向切面编程,就是把非核心业务逻辑以切面的方式剥离处理,达到解耦的效果。
DI(Dependency injection)-包含ioc对于交给Spring管理某个对象,如果依赖于其他对象,他会给你自动注入(设置进来)。
java
public class EmployeeServiceImpl implements IEmployeeService{
//spring会把它管理EmployeeDao实现自动给你设置进来
@Autowired
private IEmployeeDao dao;
}
Spring框架的好处
-
方便解耦,降低维护难度,提高开发效率(Spring相当于是一个大的工厂,它提供的IOC思想,可以将对象的创建和依赖关系维护都交给spring管理);
-
spring支持AOP编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能,可以将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用);
-
Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。在企业级开发中,通常用于整合其他层次的框架;
-
方便程序的测试(Spring 对junit4支持,可以通过注解测试Spring 程序,非常便捷);
-
方便集成各种优秀的框架(Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部,也可以集成其他优秀的框架);
-
Spring降低了javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API,例如JDBC、javaMail、远程调用等,都提供了封装,是这些API应用难度大大降低);
注:Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦,很好集成三方框架,降低了j2ee项目开发难度
Spring框架的模块化
-
简单地说,模块化就是有组织地把一个大文件拆成独立并互相依赖的多个小模块;
-
Spring框架的功能大约由20个模块组成,这些模块按组可以分为:
(1) Core Container(核心容器):
-
Beans:负责Bean工厂中Bean的装配,所谓Bean工厂即是创建对象的工厂,Bean的装配也就是对象的创建工作;
-
Core:这个模块即是负责IOC(控制反转)最基本的实现;
-
Context:Spring的IOC容器,因大量调用Spring Core中的函数,整合了Spring的大部分功能。Bean创建好对象后,由Context负责建立Bean与Bean之间的关系并维护。所以也可以把Context看成是Bean关系的集合;
-
SpEl:即Spring Expression Language(Spring表达式语言);
-
(2) Data Access/Integration(数据访问/集成):
-
JDBC:对JDBC的简单封装;
-
ORM:支持数据集成框架的封装(如Mybatis,Hibernate);
-
OXM:即Object XML Mapper,它的作用是在Java对象和XML文档之间来回转换;
-
JMS:生产者和消费者的消息功能的实现;
-
Transations:事务管理;
(3) Web与远程调用:
-
WebSocket:提供Socket通信,web端的的推送功能;
-
Servlet:Spring MVC框架的实现;
-
Web:包含web应用开发用到Spring框架时所需的核心类,包括自动载入
WebApplicationContext特性的类,Struts集成类、文件上传的支持类、Filter类和大量辅助工具类;
-
Portlet:实现web模块功能的聚合(如网站首页(Port)下面可能会有不同的子窗口(Portlet));
(4) AOP:面向切面;
(5) Aspects:同样是面向切面的一个重要的组成部分,提供对AspectJ框架的整合;
(6) Instrumentation(设备):相当于一个检测器,提供对JVM以及对Tomcat的检测;
(7) Messaging(消息):Spring提供的对消息处理的功能;
(8) Test(测试):我们在做单元测试时,Spring会帮我们初始化一些测试过程当中需要用到的资源对象;
写在最后
Spring是当前主流的WEB开发框架,并且是Springboot,SpringMVC的铺垫,本篇文章主要介绍了一些Spring的基本知识,后续还会更新更多知识。笔者小,中,大厂均有面试经历,每日坚持分享JAVA全栈相关知识,希望能够与大家共同进步。