IT铁人DAY 10-Abstract Factory 抽象工厂

  今天要认识的Abstract Factory与Factory Method很像,算是Factory Method强化版,现在就让我们来了解它们之间的差异吧!


问题情境与解析

  假想现在有一个工厂专门供应运动服装,有球衣、球裤、球鞋等,有一系列的产品,但随着事业越做越大,与不同的品牌合作,像是Nike、Adidas等,而原本工厂的系统添加新产品或是产品系列的话会需要更改原本的程序,若是越来越多品牌或是商品与之合作,程序只会越来越复杂,且重复相关的程序码会一直在系统里排程。再说供应商应该会经常更新他们的产品目录,我想不会有人希望每次都要更改核心程序码。

  使用抽象工厂模式的话,需要将产品系列(如球衣、球裤、球鞋等)做一个介面,让不同品牌的产品(如Nike球衣、Adidas球衣等)去实作对应的介面;再来要将品牌作为抽象工厂,其中的方法包含产品系列中的所有产品,也就是球衣、球裤、球鞋等,让不同品牌的具体工厂去实作,并回传该品牌的产品。

  如此一来,就可以依据抽象工厂创建的品牌工厂类别,去回传特定品牌的产品系列,举个例子来说,Nike工厂类别只会做Nike的球衣、Nike的球裤及Nike的球鞋,并不会去做Adidas的球衣球裤等等。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210925/20140743UySdwFQYjM.png

Skeleton Code

interface ProductA {
    void doSomething();
}

class ProductA1 implements ProductA {
    public void doSomething() {
        // some operation
    }
}

class ProductA2 implements ProductA {
    public void doSomething() {
        // some operation
    }
}

interface ProductB {
    void doSomething();
}

class ProductB1 implements ProductB {
    public void doSomething() {
        // some operation
    }
}

class ProductB2 implements ProductB {
    public void doSomething() {
        // some operation
    }
}

interface AbstractFactory {
    abstract ProductA cteateProductA();
    abstract ProductB cteateProductB();
}

class Factory1 implements AbstractFactory {
    public ProductA cteateProductA() {
        return new ProductA1();
    }
    public ProductB cteateProductB() {
        return new ProductB1();
    }
}

class Factory2 implements AbstractFactory {
    public ProductA cteateProductA() {
        return new ProductA2();
    }
    public ProductB cteateProductB() {
        return new ProductB2();
    }
}

  虽然具体工厂(如Factory1)实例化了具体产品(如ProductA1),但其创建的方法必须回传相应的抽象产品(如cteateProductA()回传的产品型态是ProductA,而ProductA是抽象界面,并非是是具体类别ProductA1)。所以客户端就不需要知道你用的是哪个工厂做了哪个特定的产品,唯一的窗口只有抽象工厂,并在初始化阶段定义其出厂型态,如此就可以避免不必要的耦合发生在客户与产品之间。


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  [Day 14] 第一主餐 pt.7-一支API,千万request来相见

>>:  [Day 11] Select 下拉

Day8|【Git】检视纪录 - git log

学习到将档案提交到储存库後,现在来看看如何检视之前的 Commit 纪录吧。 检视纪录 - git ...

[Day4] Array Cardio Day 1

[Day4] Array Cardio Day 1 Javascript 的技巧 需要用到的技巧与练...

五套最佳SoundCloud下载器--〖2022〗

SoundCloud 是一家位於德国柏林的在线音频分发平台。 对於那些喜欢好音乐并想找到更多背景音乐...

好的履历是面试的入门票

标题开头可能大家读起来不就是废话吗,履历怎麽写,Google 关键字详细到有成千上万页的各种样式可做...

Day 2:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《Vivy -Fluorite Eye's Song》Part 2

续角色介绍,但也是快要没梗,只能说真正有趣的会是几个Vivy经历过的事件扭转,如果透过AWS相关服务...