创建型设计模式---抽象工厂模式

1. 介绍


1.1 定义


抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类

1.2 主要作用


允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。

1.3 解决的问题


每个工厂只能创建一类产品

即工厂方法模式的缺点
 

2.业务场景

抽象工厂模式是三种工厂模式中最为复杂的一个,其关键在于品牌家族的概念,这里的一个工厂要生产某一个品牌家族里面的系列产品。

下图为具体案例的UML

图中有两个产品家族 小米公司 和 苹果公司 ,每个产品家族中包含两种产品,笔记本电脑与手机。

所以需要两个工厂。XiaoMiFactory AppleFactory,他们都实现抽象工厂接口AbstractFactory
XiaoMiFactory生产MiComputerMiPhoneAppleFactory生产MacComputerIPhone
其中MiComputer和MacComputer是同一类型的产品,都是笔记本电脑,实现同一个接口Computer。
其中MiPhoto和IPhoto是同一类型的产品,都是手机,实现同一个接口MobilePhoto。
 

使用抽象工厂模式

第一步:定义一个电脑的抽象基类,里面有一个为电脑安装操作系统的抽象方法。

//电脑接口
public abstract class Computer {
    public abstract void setOperationSystem();
}
public class MacComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("Mac笔记本安装Mac系统");
    }
}
public class MiComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("小米笔记本安装Win10系统");
    }
}

第二步:定义一个手机的抽象基类,里面有一个为手机安装操作系统的抽象方法。

//手机接口
public abstract class MobilePhone {
    public abstract void setOperationSystem();
}
public class IPhone extends MobilePhone {
    @Override
    public void setOperationSystem() {
        System.out.println("苹果手机安装IOS系统");
    }
}
public class MiPhone extends MobilePhone {
    @Override
    public void setOperationSystem() {
        System.out.println("小米手机安装Android系统");
    }
}

第三步:定义工厂类,这里的工厂不是按照具体的产品类型定义,而是按照品牌家族来定义。

例如现在有两个品牌小米和苹果,那么就需要分别为这两个品牌各定义一个工厂,每个工厂生产这个品牌家族的系列产品,例如笔记本电脑和手机。

//抽象工厂接口
public interface AbstractFactory {
     Computer makeComputer();
     MobilePhoto makeMobilePhone();
}
public class AppleFactory implements AbstractFactory {
    @Override
    public Computer makeComputer() {
        return new MacComputer();
    }

    @Override
    public MobilePhoto makeMobilePhone() {
        return new IPhone();
    }
}
public class XiaoMiFactory implements AbstractFactory {
    @Override
    public Computer makeComputer() {
        return new MiComputer();
    }

    @Override
    public MobilePhoto makeMobilePhone() {
        return new MiPhone();
    }
}

第四步:使用工厂来生产产品,这里每个工厂生产的是那个品牌家族的一系列产品,而不是一个。

    public static void main(String[] args) {
        //使用苹果工厂生产苹果公司的系列产品
        AbstractFactory appleFactory=new AppleFactory();
        appleFactory.makeComputer().setOperationSystem();
        appleFactory.makeMobilePhone().setOperationSystem();

       //使用小米工厂生产小米公司的系列产品
        AbstractFactory miFactory=new XiaoMiFactory ();
        miFactory.makeComputer().setOperationSystem();
        miFactory.makeMobilePhone().setOperationSystem();
    }

理解抽象工厂模式的核心关键在于理解品牌家族的概念,简单工厂方法与工厂方法创建工厂的着眼点为某类具体的产品,某个工厂与某个产品对应,而抽象工厂某个工厂与产品的家族对应,这个工厂可以生产这个品牌家族的一系列产品。

抽象工厂模式技术要点总结

  • 要准确识别出当前场景是在构建哪些产品家族的系列产品对象。
  • 每个产品家族的产品系列都要在 AbstractFactory 接口里面定义
     

猜你喜欢

转载自blog.csdn.net/h18377528386/article/details/125117157