概念及定义
抽象工厂模式提出更了一种生产同一系列的各类产品的思想,一个抽象工厂中定义了一系列不同的产品,在一个固定的工厂实现类中,你可以生产的产品都是由工厂实现类内部决定的。
类似于 apple 的 appstore。在 MAC 的 appstore 中搜索应用的结果会有 Mac App/IPhone 与 IPad APP 两个标签页。其中 Mac APP 中可以有 QQ,微信等应用。IPhone 与 IPad APP 中也可以有 QQ,微信等应用。假设你有一台 Mac 你大多数时候应该只关心 Mac APP 这个标签,因为你只需要 Mac 系列的应用。这个例子中 appstore 作为一个抽象工厂,Mac App/IPhone 与 IPad APP 作为他的两个具体实现类。一个为我们提供适用于 mac 的 app,另一个为我们提供适用 IPhone 与 IPad 的 app。这样的话,可以清晰的为用户提供适配的产品类型。
抽象工厂模式的主要思想:
通过定义抽象工厂类中的具体公共方法,来定义可以生产的产品。不同系列的工厂实现类,可以为这些公共产品赋予独有的特性:开头例子中的适用平台。用户通过指定的工厂实现类可以生产出指定特性的产品。
抽象工厂模式中角色以及职责:
AbstractFactory(抽象工厂角色)
定义工厂的公共生产方法。
Factory(工厂实现角色)
对公共生产方法重写,实现对应指定产品实现的生产。
AbstractProduct(抽象产品角色)
定义产品的公共方法。
Product(产品实现角色)
对公共方法重写,实现产品的独有特性。
抽象工厂模式的优缺点:
优点:
单一职责,工厂类负责产品对象的创建。
调用者只需要关心产品对应的工厂类,即可以创建出对应的具体产品,而不需要了解具体的产品类。
与简单工厂模式进行对比,在新增产品类别的时候,无需修改已有代码,直接新增对应的产品类与对应的产品工厂类即可,降低了耦合性。
对于一些根据特定环境,需要由不同特性的组件来实现的业务中,可以起到很大的作用。
缺点:
增加新产品的时候,需要在抽象工厂类中添加对应方法,各个工厂具体实现类中也需要增加对应方法。
实现步骤:
定义抽象产品接口:
public interface ICar {
void drive();
}
复制代码
public interface IEngine {
void start();
}
复制代码
定义抽象工厂类:
public interface AbstractFactory {
ICar produceCar();
IEngine produceEngine();
}
复制代码
定义具体产品实现类与具体工厂实现类:
public class TeslaCar implements ICar{
@Override
public void drive() {
System.out.println("Tesla 滴滴滴");
}
}
复制代码
public class TeslaEngine implements IEngine{
@Override
public void start() {
System.out.println("Tesla 轰轰轰");
}
}
复制代码
public class TeslaFactory implements AbstractFactory{
@Override
public ICar produceCar() {
return new TeslaCar();
}
@Override
public IEngine produceEngine() {
return new TeslaEngine();
}
}
复制代码
public class VolkswagenCar implements ICar{
@Override
public void drive() {
System.out.println("Volkswagen 滴滴滴");
}
}
复制代码
public class VolkswagenEngine implements IEngine{
@Override
public void start() {
System.out.println("Volkswagen 轰轰轰");
}
}
复制代码
public class VolkswagenFactory implements AbstractFactory{
@Override
public ICar produceCar() {
return new VolkswagenCar();
}
@Override
public IEngine produceEngine() {
return new VolkswagenEngine();
}
}
复制代码
public class AbstractFactoryPattern {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> FactoryClazz1 = Class.forName("VolkswagenFactory");
AbstractFactory carFactory1 = (AbstractFactory)FactoryClazz1.newInstance();
ICar volkswagenCar = carFactory1.produceCar();
IEngine volkswagenEngine = carFactory1.produceEngine();
//生产出来的产品都是大众系的
volkswagenCar.drive();
volkswagenEngine.start();
Class<?> FactoryClazz2 = Class.forName("TeslaFactory");
AbstractFactory carFactory2 = (AbstractFactory) FactoryClazz2.newInstance();
ICar teslaCar = carFactory2.produceCar();
IEngine teslaEngine = carFactory2.produceEngine();
//生产出来的产品都是特斯拉系的
teslaCar.drive();
teslaEngine.start();
}
}
复制代码
总结:
由测试结果可见:
同一共产生产的产品,都是由工厂定义的同一系列的产品。
抽象工厂模式即实现:通过获取工厂类名,利用反射,即可得到对应的工厂实现类来生产对应的一系列产品。
评论