这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
这本质上也是工厂模式的一种,要不然名字里怎么会到工厂呢。涉及工厂的模式都是创建实例的模式,思路大致相同,都是最大程度的复用代码,减少与客户端的耦合。其实初学编程的时候认知里面的客户端并不一定像手机那样的第三方远程调用者,很多时候就是业务代码内部的其他类。 减少耦合的目的就是为了让项目代码本身看起来思路更清晰。
那么抽象工厂到底是干嘛的呢?工厂模式只做了一层抽象,具体的子类使用的大多方法都在父类的抽象方法集合内,是一个相对简单的继承关系。但抽象方法增加了一层抽象,把动作和对象都进行了抽象,再交给具体的业务类去分别继承和实现。这么做有什么好处呢?当多个行为在多个不同场景下有不同的实现时,借此可以很大程度的降低耦合,只用关注各自场景的实现就好了,逻辑更加统一,也避免了很多重复代码。下面举个例子:
外出旅行交通工具的选择,坐飞机还是坐火车:
public interface AbstractFactory {
// 坐飞机
PlaneTrip takePlane(String name);
// 坐火车
TrainTrip takeTrain(String name);
}
火车和飞机分别的是如何订票和乘坐的,都不一样在:
// 坐飞机
public interface PlaneTrip {
void order(String name) throws BizException;
}
// 坐火车
public interface TrainTrip {
void order(String name);
}
下面是实现:
public class PlaneTripImpl implements HtmlDocument {
public void order(String name) throws BizException {
...
}
}
public class TrainTripImpl implements TrainTrip {
public void order(String name) throws BizException {
...
}
}
然后比如我们接入了携程和去哪儿这样的第三方资源:
public class CtripFactory implements AbstractFactory {
public PlaneTrip takePlane(String name) {
return new PlaneTrip(md);
}
public TrainTrip takeTrain(String name) {
return new TrainTrip(md);
}
}
最后我们再来一个简单工厂中的根据名称来创建对应工厂实例的方法:
public interface AbstractFactory {
public static AbstractFactory createFactory(String name) {
if (name.equalsIgnoreCase("Ctrip")) {
return new CtripFactory();
} else if (name.equalsIgnoreCase("Qunar")) {
return new QunarFactory();
} else {
throw new IllegalArgumentException("Invalid factory name");
}
}
}
使用时,只需要调用create方法创建对应的工厂就可以使用了:
AbstractFactory factory = AbstractFactory.createFactory("Ctrip");
其实现在创建型的设计模式随着spring依赖注入的的普及已经开始变的没那么重要了,现在已经没有创建对象的焦虑,但这种降低耦合的思想还是值得使用的。