对于工厂模式来说,它只是针对一个维度其生产,也就是大部分博客说的针对产品等级。如果放在前面的例子里,也就是我们只是针对把些图形的比较大致的分法,三角形、正方形、圆形,但是如果细分,三角形还有等腰三角形、直角三角形。如果按这个套路,那么我们的分类就是一个二维的了,对于工厂模式来说,这个样子下去,我们得写好多好多的类,这个就要增加系统的复杂度了,所以,这个时候我们就想到了一种工厂模式的升级版——抽象工厂模式。结构图如下所示,示例是以网上生产汽车的例子说明的。
代码实现:
interface Car{
public void create();
}
class Audi implements Car{
public void create(){
System.out.println("这是一辆奥迪车!");
}
}
class BMW implements Car{
public void create(){
System.out.println("这是一辆宝马车!");
}
}
interface Mtype{
public void display();
}
class SUV implements Mtype{
public void display(){
System.out.println("这是一辆SUV!");
}
}
class MPV implements Mtype{
public void display(){
System.out.println("这是一辆MPV!");
}
}
interface CarFactory{
public Car createCar();
public Mtype displayCar();
}
class AudiCar implements CarFactory{
public Car createCar(){
return new Audi();
}
public Mtype displayCar(){
return new SUV();
}
}
class BMWCar implements CarFactory{
public Car createCar(){
return new BMW();
}
public Mtype displayCar(){
return new MPV();
}
}
public class Client {
public static void main(String args[]){
CarFactory factory = new AudiCar();
factory.createCar().create();
factory.displayCar().display();
}
}
抽象工厂模式的优点:
1、实现了接口与实现的分离,客户端使用抽象工厂来创建需要的对象时,客户端根本不知道具体的实现是谁,客户端只是面向产品的接口编程而已。
2、当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
3、 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
抽象工厂的缺点:
当需要给整个产品等级添加一个新的等级结构时,那么就需要修改抽象工厂,这样就会导致需要修改所有工厂的实现类,不符合开闭原则。
参考博客:
http://blog.csdn.net/superbeck/article/details/4446177
http://blog.csdn.net/zhengzhb/article/details/7359385
http://blog.csdn.net/lovelion/article/details/9319481