工厂模式:
有很多解释,我这里把我所理解的结合经验,诠释给大家:公司有个这样一个需求,在App中要使用到LBS定位来实现某些功能。产品技术一大堆开始了需求、技术确认会,当大家讨论到定位是用百度API来实现,还是用高德来实现。大家争论不休,有人说百度定位不准,有人说高德定位不准,众说纷纭。咋办?最后,B总拍板,两个一起用,哪个好用哪个,领导拍板了,但说了又等于没说,咋办?工厂模式这时候就呼之欲出了,我两个都给你设计,代码设个开关和参数,你说用高德不爽,我改个参数,就换百度,直到领导高兴为止,于是代码就产生了。
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对象,通常使用静态工厂方法。