创建型设计模式——抽象工厂模式
抽象工厂模式的定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
抽象工厂模式的使用场景
一个对象族有相同的约束时可以使用抽象工厂模式。在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。这时我们可以把多个工厂方法组合到一个类,这就是抽象工厂模式,它就是专门用来创建多个产品,也可以说是创建产品家族的。
抽象工厂模式实例
抽象工厂角色
AbstractFactory.class
public abstract class AbstractFactory {
/**
* description: 创建产品A的方法
*/
public abstract AbstractProductA createProductA();
/**
* description: 创建产品B的方法
*/
public abstract AbstractProductB createProductB();
}
具体工厂角色
ConcreteFactory1.class
public class ConcreteFactory1 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
ConcreteFactory2.class
public class ConcreteFactory2 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
抽象产品角色
AbstractProductA.class
public abstract class AbstractProductA {
/**
* description: 每个具体的产品子类需要实现的方法
*/
public abstract void method();
}
AbstractProductB.class
public abstract class AbstractProductB {
/**
* description: 每个具体的产品子类需要实现的方法
*/
public abstract void method();
}
具体产品角色
ConcreteProductA1.class
public class ConcreteProductA1 extends AbstractProductA {
@Override
public void method() {
}
}
ConcreteProductA2.class
public class ConcreteProductA2 extends AbstractProductA {
@Override
public void method() {
}
}
ConcreteProductB1.class
public class ConcreteProductB1 extends AbstractProductB {
@Override
public void method() {
}
}
ConcreteProductB2.class
public class ConcreteProductB2 extends AbstractProductB {
@Override
public void method() {
}
}
小结
优点
分离接口与实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现的分离,使抽象工厂方法模式在切换产品类时更加灵活、容易
缺点
- 类文件的爆炸性增加
- 不太容易扩展新的产品类,因为每当要增加一个新的产品类就需要修改抽象工厂,那么所有的工厂类都要修改