ShuSheng007

  • 首页
  • 关于
  • 联系
ShuSheng007
天行健,君子以自强不息 地势坤,君子以厚德载物
  1. 首页
  2. 设计模式
  3. 正文

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

02/16/2020 2584点热度 5人点赞 0条评论

[版权申明]非商业目的注明出处可自由转载
出自: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

其实应该手画的,那样更具有通用性,此处偷了懒使用idea的工具按照代码示例生成了一个,凑合看吧

抽象工厂模式是三种工厂模式中最为复杂的一个,我给出了4颗星的难度,其难度直追访问者模式,其关键在于品牌家族的概念,这里的一个工厂要生产某一个品牌家族里面的系列产品。

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

  • AbstractFactory

抽象工厂接口,里面会声明生产品牌家族产品的几个方法,例如这里要生产笔记本电脑和手机,就会有这么两个方法声明。

  • XiaoMiFactory

小米产品工厂,实现抽象工厂接口AbstractFactory,生产MiComputer和MiPhone。

  • AppleFactory

苹果产品工厂,实现抽象工厂接口AbstractFactory,生产MacComputer和IPhone。

其中MiComputer和MacComputer是同一类型的产品,都是笔记本电脑,实现同一个接口Computer。MiPhone和IPhone是同一类型的产品,都是手机,实现同一个接口MobilePhone。

到此就一目了然了,富士康需要两个工厂,一个工厂生产小米的笔记本电脑和手机,另一个工厂生产苹果的笔记本电脑和手机。

如何实现

实例

今天王二狗约自己在富士康工作的老乡出来喝酒,没想到老乡最近一直在加班。听说接了个大活,要同时为小米公司和苹果公司代工他们的笔记本电脑和手机生产业务。

我们先定义要生产的产品,笔记本电脑和手机。

第一步:定义电脑相关的类

这里面有一个为电脑安装操作系统的抽象方法,然后定义了两个实现类。

//电脑接口
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 接口里面定义

总结

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

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

源码

一如既往,你可以从GitHub上获得本文源码:design-patterns,星星点一下,猿猿不迷路。。。

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: Abstract Factory Pattern 抽象工厂模式 装饰者模式
最后更新:03/12/2023

shusheng007

never give up ,keep going!

打赏 点赞
< 上一篇
下一篇 >

文章评论

取消回复

版权 © 2021 shusheng007.top 享有所有版权.

Theme Kratos Made By Seaton Jiang

津ICP备17001709号