秒懂设计模式之抽象工厂模式(Abstract Factory Pattern)

前言

人在IT江湖飘,不懂设计模式咋装X?

今天让我们一起来研究一下三种工厂模式,其均为创建型模式,即讨论的是如何创建一个类的对象的问题。就是以各种高逼格的方式最终将一个类的对象new出来,一点也不神秘。如果你发现需要一个类的对象而你又不会这些装X神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装X神器!

定义

The essence of the Abstract Factory Pattern is to "Provide an interface for creating families of related or dependent objects without specifying their concrete classes.".

使用场景

如果你的业务中出现了要依据不同的产品家族来生产其旗下的一系列产品的时候,抽象工厂模式就配上用场了。

例如小米公司和苹果公司就是两个不同产品家族,而他们两家都生产笔记本电脑和手机,那么小米的笔记本电脑和苹果的笔记本电脑肯定不一样,手机情况也是如此。这就构成了两个产品家族的系列产品之间比较的关系。

例如麦当劳和肯德基是两个不同的产品家族,他们都生产汉堡和果汁。

如何实现

业务场景

假设富士康接了个大活,要同时为小米公司和苹果公司代工他们的笔记本电脑和手机生产业务。

下图为抽象工厂模式UML

在这里插入图片描述
抽象工厂模式是三种工厂模式中最为复杂的一个,其关键在于品牌家族的概念,这里的一个工厂要生产某一个品牌家族里面的所有产品。

我简单的解释一下上面的UML图,图中有两个产品家族 产品家族1产品家族2 ,每个产品家族中包含两种产品。家族1包含productA1productB1家族2包含productA2productB2,其中productA1productB1是同一类型的产品,实现同一个接口AbstractProductA。其中productA2productB2是同一类型的产品,实现同一个接口AbstractProductB。现在有两个品牌家族,就需要两个工厂来生产,1ConcreteFactory1生产家族1的产品productA1productB11ConcreteFactory2生产家族2的产品productA2productB2

下图为具体案例的UML
在这里插入图片描述
此处与上面对比就一目了然了,富士康需要两个工厂,一个工厂生产小米的笔记本电脑和手机,另一个工厂生产苹果的笔记本电脑和手机。

使用抽象工厂模式

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

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 MobilePhoto {
    public abstract void setOperationSystem();
}
public class IPhoto extends MobilePhoto {
    @Override
    public void setOperationSystem() {
        System.out.println("苹果手机安装IOS系统");
    }
}
public class MiPhoto extends MobilePhoto {
    @Override
    public void setOperationSystem() {
        System.out.println("小米手机安装Android系统");
    }
}

第三步:定义工厂类,这里的工厂不是按照具体的产品类型定义,而是按照品牌家族来定义。例如现在有两个品牌小米和苹果,那么就需要分别为这两个品牌各定义一个工厂,每个工厂生产这个品牌家族的系列产品,例如笔记本电脑和手机。

public interface AbstractFactory {
     Computer makeComputer();
     MobilePhoto makeMobilePhoto();
}
public class AppleFactory implements AbstractFactory {
    @Override
    public Computer makeComputer() {
        return new MacComputer();
    }

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

    @Override
    public MobilePhoto makeMobilePhoto() {
        return new MiPhoto();
    }
}

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

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

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

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

总结

设计模式值得你刻意练习!

You May Also Like

About the Author: shusheng007

发表评论

邮箱地址不会被公开。