前言
这两天看了不少关于工厂模式的文章,但是对于理解该模式深度并没有什么突破,可能个人能力原因吧。所以还是依照网上一些比较常规的方式整理一下。
问题:为什么需要用工厂模式?
1.为了解耦
把对象的创建和使用过程分开,因为有的对象创建可能并不一定只是一个简单的new 就完了,还涉及到其它处理。但是使用者是不需要关心的,所以采用工厂设计模式能达到这样的一个效果。就像你只关心吃饭,而不需要关心这个饭菜怎么做出来的,那你就不需要自己做饭,直接去外面餐馆吃饭即可。
2.更好的控制过程
正如上面所说的,我们在创建对象的过程中,可能不只是简单的new 一下,而是需要对创建对象过程进行一些控制,比如权限控制,日志控制等等。
3.规范管理
既然是创建对象,那么可能就会有很多地方会用到,如果创建对象的过程比较复杂,那么就会产生很多冗余代码,而采用设计模式的形式能够降低这种情况。
还有就是如果不使用设计模式,我们的结构层次可能比较容易混乱,比如数据库连接,如果框架不提供统一的接口,那么每个供应商都会搞些东西,你叫createDataSource,我叫ProduceDataSource(),而如果有统一的接口,那大家来实现我的接口,这样我的接口就起到了带头作用,相当于有一根绳子拎着的。
一、简单工厂模式
比如对于我们硬件来说,我们可以生产键盘产品,鼠标产品等等。那我们首先抽象一个硬件的接口出来,让具体的产品实现这个接口。然后再创建一个工厂类出来负责生产对象。具体代码如下:
/**
* 定义一个硬件组件的公共接口,多态的运用
*/
public interface HardComponent{
}
/**
* 键盘类
*/
public class KeyBoard implements HardComponent{
public KeyBoard(){
System.out.println("创建了一个键盘");
}
}
/**
* 鼠标类
*/
public class Mouse implements HardComponent{
public Mouse(){
System.out.println("创建了一个鼠标");
}
}
/**
* 生产硬件组件的工厂
*/
public class HardComponentFactory {
public HardComponent createHardComponent(String type) throws Exception{
//通过类型进行匹配
if("keyBoard".equals(type)){
return new KeyBoard();
}else if("mouse".equals(type)){
return new Mouse();
}else{