创建型设计模式 —— 抽象工厂模式
1. 抽象工厂模式介绍
抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一。
2. 抽象工厂模式的定义
为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类。
3. 抽象工厂模式的使用场景
一个对象族有相同的约束时可以使用抽象工厂模式。举个例子,Android、iOS、Windows Phone 下都有短信和拨号软件,两者都属于软件的范畴,但是,它们所在的操作系统平台不一样,即便是同一家公司出品的软件,其代码的实现逻辑也是不同的,这个时候就可以考虑使用抽象工厂方法模式来产生 Android、iOS、Windows Phone 下的短信和拨号软件。
4. 抽象工厂模式的通用模式代码
简单的实例:
// 抽象产品类 A
public abstract class AbstractProductA {
public abstract void method();
}
// 抽象产品类 B
public abstract class AbstractProductB {
public abstract void method();
}
// 具体产品类 A1
public class ConcreteProductA1 extends AbstractProductA {
@Override
public void method() {
System.out.println("具体产品 A1 的方法");
}
}
// 具体产品类 A2
public class ConcreteProductA2 extends AbstractProductA {
@Override
public void method() {
System.out.println("具体产品 A2 的方法");
}
}
// 具体产品类 B1
public class ConcreteProductB1 extends AbstractProductB {
@Override
public void method() {
System.out.println("具体产品 B1 的方法");
}
}
// 具体产品类 B2
public class ConcreteProductB2 extends AbstractProductB {
@Override
public void method() {
System.out.println("具体产品 B2 的方法");
}
}
// 抽象工厂类
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
// 具体工厂类 1
public class ConcreteFactory1 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB1();
}
}
// 具体工厂类 2
public class ConcreteFactory2 extends AbstractFactory {
@Override
public AbstractProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public AbstractProductB createProductB() {
return new ConcreteProductB2();
}
}
总结
优点:
抽象工厂模式的一个显著的优点是分离接口与实现,客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已,使其从具体的产品实现中解耦,同时基于接口与实现的分离,使抽象该工厂方法模式在切换产品类时更加灵活、容易。
缺点:
一是类文件的爆炸性增加,二是太不容易扩展新的产品类,因为每当我们增加一个产品类就需要修改抽象工厂,那么所有的具体工厂类均会被修改。