简单工厂:工厂就是用来创造东西的,在java里面,通常是用来创造接口的,也可以创造抽象类,或是具体的类实例。
其本质是:选择实现
优点:帮助封装,真正面向接口编程;解耦-客户端根本不知道接口是由谁实现的。
下面就写一个简单的例子:
先定义一个USB的简单接口行为:
/** * * <p> * USB产品的行为接口 * </p> * <b>修改历史</b> * <ol> * <li>创建(Added by zengzhanghua on 2011-3-14)</li> * </ol> * @author zengzhanghua * @version 1.0 */ public interface UsbApi { public void readData(); public void writeData(); }
再定义一个具体的实现类:
public class AbcUsb implements UsbApi { @Override public void readData() { System.out.println("这是ABC USB读数据的实现方式"); } @Override public void writeData() { System.out.println("这是ABC USB写数据的实现方式"); } }
然后定义一个简单工厂类:
public class SimpleFactory { private SimpleFactory(){ } public static UsbApi createUsbApi(){ return new AbcUsb(); } }
客户端调用的例子:
public class Client { public static void main(String[] args){ //客户端并不知道具体实现,达到解耦的效果 UsbApi usbApi = SimpleFactory.createUsbApi(); usbApi.writeData(); } }
以上就是一个简单工厂的例子,当然如果要在该工厂中增加一种新的实现,要修改该工厂类,在里面增加一种得到其它实例的方法,当然解决这个问题,可以创建带参数的工厂类,如改为:
public static UsbApi createUsbApi(int type){
//根据类型返回相应的实例 }
}
当然还可以根据配置文件,利用反射来动态创建需要用到的实例等方式解决扩展问题。