一、概述
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
抽象工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。
二、模块
- 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
- 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
- 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性
三、示例
假如某一个苹果产品代工厂,要生产自己旗下的电脑、手机、iPad、watch等等,这种情况我们可以使用抽象工厂模式演示一下。
四、代码
第一步:创建顶级接口工厂
/**
* 顶级抽象产品类
*/
public interface AbstractProduct {
void createProduct();
}
第二步:创建抽象产品
/**
* 电脑抽象类
*/
public abstract class AbstractComputer implements AbstractProduct{
}
/**
* 手机抽象类
*/
public abstract class AbstractPhone implements AbstractProduct{
}
第三步:创建抽象工厂
/**
* 抽象工厂接口
*/
public interface AbstractFactory {
AbstractProduct createCompute();
AbstractProduct createPhone();
第四步:创建具体工厂
/**
* 具体工厂 苹果工厂
*/
public class AppleFactory implements AbstractFactory {
@Override
public AbstractProduct createCompute() {
return new AppleComputer();
}
@Override
public AbstractProduct createPhone() {
return new ApplePhone();
}
}
第五步:创建具体产品
/**
* 具体产品 电脑
*/
public class AppleComputer extends AbstractComputer{
@Override
public void createProduct() {
System.out.println("Apple电脑");
}
}
/**
* 具体产品 手机
*/
public class ApplePhone extends AbstractPhone{
@Override
public void createProduct() {
System.out.println("Apple手机");
}
}
五、测试
/**
* 测试代码
*/
public class AbstractFactoryDemo {
public static void main(String[] args) {
// 创建苹果电脑
AppleFactory appleFactory = new AppleFactory();
AbstractProduct compute = appleFactory.createCompute();
compute.createProduct();
// 创建苹果手机
AppleFactory appleFactory2 = new AppleFactory();
AbstractProduct phone = appleFactory2.createPhone();
phone.createProduct();
}
}
运行结果:
Apple电脑
Apple手机
六、思考与总结
优点:
- 抽象工厂模式隔离了对象的实例化,使客户端无需知道什么被创建,只需关注要使用的产品。
- 其次因为隔离,使得更换具体工厂变得相对容易。
- 增加新的工厂也很方便(横向扩展),符合开闭原则。
缺点:
- 不便于纵向扩展,会增加新的等级结构,对原有系统会有较大的修改,会违背开闭原则。
使用场景
- 适合一整套产品统一替换添加,例如QQ皮肤替换,替换后整个模块都会发生改变。