场景问题
面向接口编程
接口是系统可插拔的保证,面向接口编程是Java里面一个重要的编程原则,java 程序设计里非常讲究模块的划分,通常有三层 ,逻辑层,表现层和数据层。他们之间都通过接口来通信,这里画一个图表示一下三层结构(如下图1-1)
图1-1
根据上图我们可以得到组件这一个概念,即所谓组件从设计上来讲,是完成一定功能的封装体,不管是一层还是一个模块都是一个被接口隔离的整体,但是这样就引发了我们的一个思考,既然面向接口编程,那么在程序中改如何使用接口
不同模式的解决方案
以前使用接口的方式大致如下图
这里不采用代码说明
但是通过这个类图,我们可以知道客户端调用时候,必须引用具体的实现IMPL,但是其实客户端是不应该知道接口的实现类的,这违背了接口隔离的原则,对于这个,我们这时候就可以使用简单工场来解决问题
解决方案
是什么
简单工场就是提供一个创建对象实例的功能,而不需要关心具体的实现,被创建的类型可以是接口,抽象类,也可以是具体的类
为什么
模块外部是不能知道模块内部的具体实现的,只有模块内部才可以知道具体实现类,但是创建接口是需要实现一个具体的类的
怎么用
- 接口的定义
* 接口定义
*/
public interface Api {
/**
* 参数
* @param s
*/
void opertion(String s);
}
两个实现类
/**
* @author 谭婧杰
* @data 2020/1/12
* 实现类
*/
public class ApiAImpl implements Api{
public void opertion(String s) {
System.out.println("ImplA s=="+s);
}
}
/**
* @author 谭婧杰
* @data 2020/1/12
*/
public class ApiBImpl implements Api {
public void opertion(String s) {
System.out.println("ImplB ==="+s);
}
}
创建工场
/**
* @author 谭婧杰
* @data 2020/1/12
*/
public class Factory {
public static Api createApi(int type){
Api api = null;
if(type == 1){
api = new ApiAImpl();
} else if (type == 2) {
api = new ApiBImpl();
}
return api;
}
}
客户端调用
/**
* @author 谭婧杰
* @data 2020/1/12
*/
public class Client {
public static void main(String[] args) {
Api api = Factory.createApi(1);
api.opertion("正在使用简单工场模式");
}
}
结果截图
模式详解
工场,顾名思义是用来创建东西的,我们程序中的工场就是用来创建接口的,但是也可以用来创建一个抽象类或者普通类的实例
优点
- 帮助封装 让组件外部面向接口编程
- 解耦 客户端与具体实现类解耦
缺点 - 可能增加客户端的复杂度
- 不方便扩展子工场
本质 :
选择实现,简单工场的重点在于选择,实现是已经做好了的,就算实现在简单也要有具体的实现类来实现,而不是在简单工场里实现,简单工场的目的在于为客户端来选择需要的实现,从而实现客户端与实现之间的解耦