简单工厂模式:从名字来看 工厂:就是生产产品的,那么在java中肯定是创建对象的,而在java中创建对象我们new一个就是了,为什么还要使用工厂去new对象呢?先看下简单工厂模式后再回来解释这个问题
简单工厂模式的定义:提供一个创建实例功对象的功能,而无需关心其详细的实现,被创建实例的类型能够是接口,抽象类,详细的类
简单工厂结构如图:
说明:
Api:定义客户所需的功能接口(也就是获取创建实例的对象)
Impl:详细实现Api的实现类,可能会有多个
Factory:工厂。选择合适的实现类来创建Api接口对象
Client: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
/** * client。使用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中加入对应的代码就可以,我们在外部调用就变的非常easy,通常还要做缓存,而不是每次都去new一个实例,详细的还要看项目需求了,