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

[版权申明]非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86644481
出自:shusheng007

设计模式汇总篇,一定要收藏:

永不磨灭的设计模式(有这一篇真够了,拒绝标题党)

前言

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

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

类型

创建型(creational)

难度

4颗星

定义

对没有相关经验的同学的废话又来了:

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
在这里插入图片描述
图中有两个产品家族 小米公司苹果公司 ,每个产品家族中包含两种产品,笔记本电脑与手机。

所以需要两个工厂。XiaoMiFactoryAppleFactory,他们都实现抽象工厂接口AbstractFactory
XiaoMiFactory生产MiComputerMiPhotoAppleFactory生产MacComputerIPhoto
其中MiComputerMacComputer是同一类型的产品,都是笔记本电脑,实现同一个接口Computer
其中MiPhotoIPhoto是同一类型的产品,都是手机,实现同一个接口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 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();
    }

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

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

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

总结

总的来说此模式在日常开发中使用频率不高,但关键时刻是能起大作用的。

设计模式值得你可以练习!

GitHub源码地址:design-patterns

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShuSheng007

亲爱的猿猿,难道你又要白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值