简单工厂模式:从名字来看 工厂:就是生产产品的,那么在java中肯定是创建对象的,而在java中创建对象我们new一个就是了,为什么还要使用工厂去new对象呢?先看下简单工厂模式后再回来解释这个问题
简单工厂模式的定义:提供一个创建实例功对象的功能,而无需关心其具体的实现,被创建实例的类型可以是接口,抽象类,具体的类
简单工厂结构如图:
说明:
Api:定义客户所需的功能接口(也就是获取创建实例的对象)
Impl:具体实现Api的实现类,可能会有多个
Factory:工厂,选择合适的实现类来创建Api接口对象
Client:客户端,通过Factory去获取Api接口对象,然后面向Api接口编程
代码如下:
Api.java
/**
* 接口的定义,该接口可以通过简单工厂来创建
*/
public interface Api {
/**
* 示意,具体的功能方法的定义
* @param s 示意,需要的参数
*/
public void operation(String s);
}
Factory.java
/**
* 工厂类,用来创造Api对象
*/
public class Factory {
/**
* 具体的创造Api对象的方法
* @param condition 示意,从外部传入的选择条件
* @return 创造好的Api对象
*/
public static Api createApi(int condition){
//应该根据某些条件去选择究竟创建哪一个具体的实现对象
//这些条件可以从外部传入,也可以从其它途径获取
//如果只有一个实现,可以省略条件,因为没有选择的必要
//示意使用条件
Api api = null;
if(condition == 1){
api = new ImplA();
}else if(condition == 2){
api = new ImplB();
}
return api;
}
}
ImplA.java
/**
* 接口的具体实现对象A
*/
public class ImplA implements Api{
public void operation(String s) {
//实现功能的代码,示意一下
System.out.println("ImplA s=="+s);
}
}
ImplB.java
/**
* 接口的具体实现对象B
*/
public class ImplB implements Api{
public void operation(String s) {
//实现功能的代码,示意一下
System.out.println("ImplB s=="+s);
}
}
Client.java
/**
* 客户端,使用Api接口
*/
public class Client {
public static void main(String[] args) {
//通过简单工厂来获取接口对象
Api api = Factory.createApi(1);
api.operation("正在使用简单工厂");
}
}
从上面的代码中Client中并没有直接去new一个 ImplA的实例对象,而是通过Factory工厂类去实现new一个ImplA类,这就相当于在Client类与ImplA类之间转换了一下,
从而我们要创建什么对象,只要在createApi()中的参数变一下就得到了相应的对象,具体的实现是封装在Factory类中,这样做的好处是以后系统维护和升级中如果要添加一个实例对象,只要在Factory中添加相应的代码即可,我们在外部调用就变的很简单,通常还要做缓存,而不是每次都去new一个实例,具体的还要看项目需求了,