1、描述

通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品。

工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂,而抽象工厂模式是多个产品系列一个工厂类。

工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列

2、适用性

抽象工厂模式可以看作工厂方法模式的扩展,在一个系统要由多个产品系列中的一个来配置时,工厂方法模式无法满足,这时就可以使用抽象工厂模式。这样介绍有点晦涩,下面通过实战代码的例子很好理解。

3、实现逻辑

  • 抽象产品类 :工厂类所创建的所有对象的超类,它负责描述所有实例所共有的公共接口。定义产品的规范,描述了产品的主要特性和功能。
  • 具体产品类 :实现或者继承抽象产品的子类;是工厂模式的创建目标,所有创建的对象都是这个具体类的实例。在抽象工厂模式中某具体产品有专门的具体工厂类创建,但不同于工厂方法模式,它们之间是一对多的关系,及一个具体工厂类可以创建多个具体产品类。
  • 抽象工厂类:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。制定具体工厂类的规范。
  • 具体工厂类:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。可供客户端直接调用某一方法创建出具体产品实例。

4、实战代码

之前的工厂方法模式,我们用的 Tea 和 Coffee 为例。但是在实际生活中,Tea 和 Coffee 都有着许多种类。下面我们通过 BlackTea 和 GreenTea 以及 Nestle 和 Latte 这个几种饮品为具体产品类,DrinksAFactory 和 DrinksBFactory 为分别可以创建 BlackTea 、Nestle 和 GreenTea 、Latte 的工厂类来简单演示抽象工厂模式。

/**
 * 抽象产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:19:25
 */
public abstract class Tea {
}

/**
 * 具体产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:21:19
 */
public class BlackTea extends Tea {
    public BlackTea() {
        System.out.println("BlackTea");
    }
}

/**
 * 具体产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:21:56
 */
public class GreenTea extends Tea{
    public GreenTea() {
        System.out.println("GreenTea");
    }
}

/**
 * 抽象产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:26:36
 */
public abstract class Coffee {
}

/**
 * 具体产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:22:26
 */
public class Nestle extends Coffee {
    public Nestle() {
        System.out.println("Nestle");
    }
}

/**
 * 具体产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:23:15
 */
public class Latte extends Coffee {
    public Latte() {
        System.out.println("Latte");
    }
}

/**
 * 抽象工厂类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 08:03:13
 */
public interface DrinksFactory {
    Coffee createCoffee();

    Tea createTea();
}

/**
 * 具体工厂类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:26:53
 */
public class DrinksAFactory implements DrinksFactory {

    @Override
    public Coffee createCoffee() {
        return new Nestle();
    }

    @Override
    public Tea createTea() {
        return new BlackTea();
    }
}

/**
 * 抽象工厂类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-06 20:26:53
 */
public class DrinksBFactory implements DrinksFactory {

    @Override
    public Coffee createCoffee() {
        return new Latte();
    }

    @Override
    public Tea createTea() {
        return new GreenTea();
    }
}

/**
 * 测试类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:41:14
 */
public class Client {

    public static void main(String[] args) {
        DrinksFactory drinksAFactory = new DrinksAFactory();
        Coffee coffeeA = drinksAFactory.createCoffee();
        Tea teaA = drinksAFactory.createTea();

        DrinksFactory drinksBFactory = new DrinksBFactory();
        Coffee coffeeB = drinksBFactory.createCoffee();
        Tea teaB = drinksBFactory.createTea();
    }
}

客户端执行结果:

从结果可以看出,A 工厂和 B 工厂根据同样的方法创建不同系列的实例。实际开发中, 系统中有多个产品族,但每次只使用其中的某一族产品。

例如,有的人喜欢 APPLE 品牌,有的人喜欢华为品牌。然后手机、手表、平板都打算使用同一系列,这种情况就非常符合抽象工厂模式。

原文地址:http://www.cnblogs.com/eajur/p/16863928.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性