工厂模式:
工厂方法模式的特点是:
一个抽象产品类(或接口),派生(或实现)多个真实产品类
一个抽象工厂类(或接口),派生(或实现)多个真实工厂类
一般来说标准的工厂方法模式需要一个工厂只生产一种产品,那么当产品种类特别多的时候工厂的数量就特别多,所以通常会使用一些工厂方法模式的变种.
标准工厂方法模式:
首先先介绍一下标准的工厂方法模式,不带任何的变种.以工厂生产不同操作系统的手机为例.
建立一个产品接口,提供一个获取系统信息的方法.
public class test { public static void main(String[] args) { Location position= new LocationFactory().getInstance("xiaomi"); position.getPosition(); position.getCityName(10, 20); } }
class LocationFactory{ public static Location getInstance(String type){ if("baidu".equals(type)){ return new BaiduLocation(); }else { return new XiaoMiLocation(); } } } class BaiduLocation implements Location{ @Override public void getPosition() { // TODO Auto-generated method stub System.out.println("通过百度定位获取到当前的经纬度是XXXXX"); } @Override public void getCityName(long lat, long lng) { // TODO Auto-generated method stub System.out.println("通过百度定位获取到当前的城市是XXXXX"); } } class XiaoMiLocation implements Location{ @Override public void getPosition() { // TODO Auto-generated method stub System.out.println("通过小米定位获取到当前的经纬度是XXXXX"); } @Override public void getCityName(long lat, long lng) { // TODO Auto-generated method stub System.out.println("通过小米定位获取到当前的城市是XXXXX"); } } interface Location{ public void getPosition(); public void getCityName(long lat,long lng); }
上面的例子,较好的阐述了工厂模式的概念。LocationFactory是一个工厂类,静态函数getInstance的参数决定了是选用百度还是高德,这样,对于调用者来说,只需要关心你是用百度还是高德即可。Location是一个接口,它抽象出高德和百度常用的函数调用。拿定位来说,基本上常用的就是根据经纬度查询地址,或者定位当前所在位置获取经纬度。当然可能还有更多有用的函数,我这里就不在列举。有了这样一个共性的接口,XiaoMiLocation和BaiduLocation通过实现它的接口就能分别满足调用者的需求。调用者就能够任意通过改变参数,来实现来自不同定位API的需求。可以使用谷歌API,只需要构造一个GoogleLocation类并实现Location接口的方法即可。
工厂模式的应用非常广泛,比如android的bitmap中常用的BitmapFactory类,创建Bitmap对象,通常使用静态工厂方法。