框架与设计模式
框架是什么:框架是能完成一定功能的半成品软件。
框架做什么:框架能够完成一定功能,加速应用开发速度;可提供一个精良的程序架构。
框架与应用程序的关系:谁来做和做什么?框架完成一部分功能,应用开发人员完成一部分功能。
比如在一个大的应用系统中,应用开发只需要关注业务实现即可,应用框架可能实现的功能有:
(1)统一响应返回报文,规范报文格式内容;
(2)基类定义,通用字段约定;
(3)统一异常处理机制;
(4)提供公共API使用,工具类开发;
(5)提供第三方组件封装使用,如:hadoop、hbase、kafka、mybitas、redis等;
应用程序:只需关注业务流程功能实现。接口开发、用户体验交互等。
框架与设计模式的比较:
(1)设计模式比框架更抽象:框架是一个已经实现了的半成品软件;设计模式在于解决的问题的方案和思想上。
(2)设计模式是 比框架更小的体系结构元素:框架是已实现了的软件,而一个框架可包含多种设计模式的应用。
(3)框架比设计模式更特例化:框架是针对特定领域的,解决的是某个领域内的问题,每个领域的框架都是不一样的;设计模式注重从思想上、方法上解决问题,不局限于某个领域,更加通用化。
定义及本质
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
本质:延迟到子类来选择实现。
结构示意图:
工厂方法详解
(1)工厂方法的功能,是让主类在不知道具体实现的情况下,完成自身功能的调用;而将具体的实现延迟到子类实现。
(2)工厂方法的实现,通常父类是一个抽象类,抽象类中包含创建对象的抽象方法,这些抽象方法就是工厂方法。
(3)工厂方法的返回,一般是被创建对象的接口对象,一个抽象类或一个类的实例。
(4)工厂方法一般不提供给外部(客户端)调用,其所创建的对象一般也不提供给外部使用,主要由创建器类内部的方法来使用工厂方法创建对象。
(5)可以把父类由抽象类实现成为一个具体的类。
依赖倒置原则
依赖:要依赖抽象类,不要依赖于具体类。
倒置:也就是接口的所有权问题,低层实现的接口所有权不在低层组件手中,而是倒置到高层组件了。接口中的功能就是高层组件需要的功能,高层组件提出要求,由低层组件实现高层组件所要求的接口功能。
UML类图
调用时序图
优缺点
优点:
(1)无须知道具体实现:具体实现由子类完成。
(2)容易扩展新的对象:通过工厂方法给子类的挂钩(钩子方法hook),子类提供工厂方法的实现,即可使用该子类。
(3)连接平行的类层次:使层次更易扩展和复用。
缺点:
具体产品对象和工厂方法耦合:工厂方法创建对象时,需要选择具体实现的对象,这个对象和工厂方法耦合性。
应用场景及代码实现
// 1 客户端调用类
public class Client {
public static void main(String[] args) {
AbstractCreator creatorA = new AConcreteCreator();
creatorA.operation();
AbstractCreator creatorB = new BConcreteCreator();
creatorB.operation();
}
}
// 2 创建器:声明工厂方法
public abstract class AbstractCreator {
// 2.1 声明工厂方法,由子类实现,实例化业务接口对象
protected abstract Api factoryApi();
// 2.2 具体业务功能实现方法
public void operation(){
// 2.3 AbstractCreator需要Api对象,不再主动创建业务实现类,交给子类的factoryApi()去实现(IOC/DI)
Api api = factoryApi();
api.operation();
}
}
// 3.1 具体创建器对象类A,继承创建器类
public class AConcreteCreator extends AbstractCreator{
@Override
protected Api factoryApi() {
// 3.1.1 真正的选择业务实现类,并创建对象(IOC/DI)
return new AApiImpl();
}
}
// 3.2 具体创建器对象类B,继承创建器类
public class BConcreteCreator extends AbstractCreator{
@Override
protected Api factoryApi() {
return new BApiImpl();
}
}
// 4 业务接口类
public interface Api {
public void operation();
}
// 5.1 业务接口实现类A
public class AApiImpl implements Api {
@Override
public void operation() {
System.out.println("AApiImpl do...");
}
}
// 5.2 业务接口实现类B
public class BApiImpl implements Api {
@Override
public void operation() {
System.out.println("BApiImpl do...");
}
}