设计模式轻松学【五】抽象工厂模式

简介: 工厂方法模式考虑的是同一类产品。比如女朋友要喝的红茶、奶茶,但红茶的工厂只能生产红茶,奶茶的工厂只能生产奶茶,同理可以知道手机厂只能造手机,如畜牧场只养动物、电视机厂只生产电视机等。

概述

抽象工厂模式(Abstract Factory)就是对一组具有相同主题的工厂进行封装。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产同一类(等级)的产品,而抽象工厂模式可生产多个类(等级)的产品。

例如:在生产奶茶过程中需要加入椰果或珍珠果,如果使用工厂方法模式,我们需要准备奶茶工厂、椰果工厂、珍珠果工厂。使用抽象工厂模式后,我们只需要一个工厂就是红茶工厂,该工厂涵盖了椰果工厂、珍珠果工厂需要做的事情。

模式由来

工厂方法模式考虑的是同一类产品。比如女朋友要喝的红茶、奶茶,但红茶的工厂只能生产红茶,奶茶的工厂只能生产奶茶,同理可以知道手机厂只能造手机,如畜牧场只养动物、电视机厂只生产电视机等。

也就是说工厂类只考虑生产同类的产品,并不能跨类生产。如果现在我有个需求,手机厂我能够生产电视怎么办,生活中这种综合型的生产商非常多,所以我应该要满足这样的需求,此时抽象工厂登场了。

产品等级

产品等级指的是不同厂商生产的同一类产品,比如手机:小米工厂生产的手机和华为工厂生产的手机不一样。在上述课程中我们学过红茶和绿茶就是相同的产品等级,他们就好比小米手机和华为手机的区别,如果只需要解决产品等级生产问题,那么使用工厂方法模式即可。

产品簇

同一个具体工厂所生产的位于不同类的一组产品称为一个产品族,比如:手机工厂生产的手机、电脑、电视。大米和电脑不能算作一个产品簇,因为他们之间没什么关系。上述中相同主题指的就是同一个产品簇。

image.png

工厂方法模式解决的范畴是产品等级(TCL空调,海尔空调)

抽象工厂模式解决的范畴是产品族等级(TCL电视机、TCL空调)

角色

  • 抽象工厂(Creator)

    该类为具体工厂的父类,主要用于规范描述具体工厂的公共接口

  • 具体工厂(Concrete Creator)

    被外界真正调用的类,实现工厂方法(FactoryMethod)创建产品的实例,包含若干个子工厂方法,如珍珠果方法,椰果方法,子工厂方法负责生产对应的具体子产品,所有具体子产品(椰果、珍珠果)组合成一个具体产品(如加珍珠果的椰果味红茶)

  • 抽象产品(Product)

    该类为具体产品的父类,主要用于规范描述具体产品的公共接口

  • 具体产品(Concrete Product)

    工厂类创建的目标类,工厂创建出来的产品对象为该类的实例

案例分析

在前面工厂方法模式学习后,我们知道,红茶有专门的红茶机器、奶茶有专门的奶茶机器,女朋友想喝什么都可以。但突然有一天,女朋友想要在红茶中加入珍珠果或椰果,在奶茶中加入椰果和珍珠果怎么办?此时混入了其他产品,此时我们可以通过抽象工厂来解决。

  • 创建抽象产品

    //抽象产品1-茶
    abstract class Tea {
        public abstract void drink();
    }
    
    //抽象产品2-辅料食物
    abstract class Food {
        public abstract void eat();
    }
  • 创建具体产品

    //具体产品1-红茶
    class RedTea extends Tea {
        public RedTea() {
            System.out.println("在制作红茶");
        }
    
        @Override
        public void drink() {
            System.out.println("喝红茶");
        }
    }
    //具体产品1-奶茶
    class MilkTea extends Tea {
        public MilkTea() {
            System.out.println("在制作奶茶");
        }
        
        @Override
        public void drink() {
            System.out.println("喝奶茶");
        }
    }
    
    //具体产品2-珍珠果
    class Pearl extends Food{
        public Pearl() {
            System.out.println("在制作珍珠果");
        }
        @Override
        public void eat() {
            System.out.println("吃珍珠果");
        }
    }
    //具体产品2-椰果
    class Coconut extends Food{
        public Coconut() {
            System.out.println("在制作椰果");
        }
        @Override
        public void eat() {
            System.out.println("吃椰果");
        }
    }
    
  • 创建抽象工厂

    //抽象工厂,抽象工厂存放着产品簇(多个不同级)产品
    abstract class AbstractFactory {
        public abstract Tea createTea();
        public abstract Food createFood();
    }
  • 创建具体工厂

    //红茶生产工厂-生产红茶和椰果
    class RedTeaFactory extends AbstractFactory {
    
        @Override
        public Tea createTea() {
            return new RedTea();
        }
    
        @Override
        public Food createFood() {
            return new Coconut();
        }
        
    }
    
    //奶茶生产工厂-生产奶茶和珍珠果
    class MilkTeaFactory extends AbstractFactory {
        
        @Override
        public Tea createTea() {
            return new MilkTea();
        }
        
        @Override
        public Food createFood() {
            return new Pearl();
        }
    }
  • 请女朋友喝茶

    public class GirlFriend {
        public static void main(String[] args) {
            RedTeaFactory redTeaFactory = new RedTeaFactory();
            Tea redTea = redTeaFactory.createTea();
            Food food1 = redTeaFactory.createFood();
            System.out.print("女朋友开始");
            redTea.drink();
            food1.eat();
        }
    }

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。

  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  • 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

总结

无论是简单工厂模式工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

目录
相关文章
|
6月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
35 0
|
5月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
33 5
|
6月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
6月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
61 2
|
2月前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
6月前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
226 4
|
3月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
42 1
|
3月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
3月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
3月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式