抽象工厂模式是一种创建型模式。
现以一个例子来说明:
现在有Q3,Q5,Q7三种车型,都是属于一个系列的车,但是三者之间的零部件差别却是很大,就拿Q3和Q7来说Q3的发动机是国产的,Q7的发动机是进口的;Q3的轮胎是普通的,Q7的轮胎是越野轮胎。
Q3,Q7对应的是一系列车,而发动机、轮胎对应的则是一系列零部件,两者是两种不同的产品类型,这时候就
可以应用抽象工厂模式。
首先,汽车工厂需要生产轮胎和发动机部件。
CarFactory.java:
public abstract class CarFactory {
// 生产轮胎
public abstract ITire createTire();
// 生产发动机
public abstract IEngine createEngine();
}
接下来为每一种零部件产品定义一个接口,并创建两个不同的实现类标识不同的零部件
public interface ITire {
// 轮胎
void tire();
}
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("普通轮胎");
}
}
public class SUVTire implements ITire {
@Override
public void tire() {
System.out.println("越野轮胎");
}
}
public interface IEngine {
// 发动机
void engine();
}
public class DomesticEngine implements IEngine {
@Override
public void engine() {
System.out.println("国产发动机");
}
}
public class ImportEngine implements IEngine {
@Override
public void engine() {
System.out.println("进口发动机");
}
}
对于生产Q3与Q7的工厂,其使用的零部件不同:
public class Q3Factory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire();
}
@Override
public IEngine createEngine() {
return new DomesticEngine();
}
}
public class Q7Factory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire();
}
@Override
public IEngine createEngine() {
return new ImportEngine();
}
}
客户端:
public class Client {
public static void main(String[] args) {
// 生产一个Q3的工厂类
CarFactory carFactory3 = new Q3Factory();
carFactory3.createTire().tire();
carFactory3.createEngine().engine();
System.out.println("=================================");
// 生产一个Q7的工厂类
CarFactory carFactory7 = new Q7Factory();
carFactory7.createTire().tire();
carFactory7.createEngine().engine();
}
}
上面只是Q3和Q7要是有很多系列的车增加进来,又要新增一个工厂类,这样势必会导致
类的文件增多,因此在实际开发中一定要谨慎使用。
总结 :
抽象工厂模式优点:
一个显著的优点是分离接口与实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道
具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口
与实现分离,使抽象工厂方法模式在切换产品类时更加灵感。
缺点:一是类文件会增加,二是不太容易扩展新的产品类,因为每当增加一个产品类就需要修改抽象工厂,
那么所有的具体工厂类均会被修改。
参考书籍:
《Android源码设计模式分析与实战》