• Java 设计模式 — 抽象工厂模式(2)


    一、谈谈抽象工厂模式

    抽象工厂模式是关于一个超级工厂创建其他工厂,这个超级工厂又被称为其它工厂的工厂。显然,这种设计模式属于创建型模式,它同时也提供了创建对象的最佳方式。

    说到这里,可能就会有人有疑惑,那么这与工厂模式有什么区别呢?我们先来看看抽象工厂模式到底是什么再去进行比对~

    二、测试代码

    抽象工厂模式的逻辑图

     创建测试代码的 Package 图

     1. 创建一个 Interface Package,里面创建两个接口,一个是 Car,一个是 Phone

    1. public interface Car {
    2. void bookCar();
    3. }
    1. public interface Phone {
    2. void bookPhone();
    3. }

    2. 创建两个 Package,一个是 Car Package,一个是 Phone Package

    <1> Phone Package中创建三个类,继承 Phone 接口,并实现接口中定义的方法

    1. public class HuaWei implements Phone {
    2. @Override
    3. public void bookPhone() {
    4. System.out.println("Book a Huawei Phone.");
    5. }
    6. }
    1. public class XiaoMi implements Phone {
    2. @Override
    3. public void bookPhone() {
    4. System.out.println("Book a XiaoMi Phone.");
    5. }
    6. }
    1. public class Apple implements Phone {
    2. @Override
    3. public void bookPhone() {
    4. System.out.println("Book a Apple Phone.");
    5. }
    6. }

    <2> Car Package中创建三个类,继承 Car 接口,并实现接口中定义的方法

    1. public class RedFlag implements Car {
    2. @Override
    3. public void bookCar() {
    4. System.out.println("Book a RedFlag Car.");
    5. }
    6. }
    1. public class BiYa implements Car {
    2. @Override
    3. public void bookCar() {
    4. System.out.println("Book a BiYa Car.");
    5. }
    6. }
    1. public class Gwm implements Car {
    2. @Override
    3. public void bookCar() {
    4. System.out.println("Book a Gwm Car.");
    5. }
    6. }

    <3> 创建抽象类来获取 Car 和 Phone 工厂

    1. public abstract class AbstractFactory {
    2. public abstract Car getCar(String car);
    3. public abstract Phone getPhone(String phone);
    4. }

    <4> 创建一个 Factory Package,其中 CarFactory 和 PhoneFactory 分别继承抽象类,并实现其中的方法,对于 CarFactory 来说就是创建自己的 Car 的实例对象,对于 PhoneFactory 来说就是创建自己的 Phone 的实例对象。对于 ProductFactory 说,那么就是用来生产 CarFactory 和 PhoneFactory ,也就是实例化这两个工厂的工厂。

    1. public class CarFactory extends AbstractFactory {
    2. @Override
    3. public Car getCar(String car) {
    4. switch (car) {
    5. case "BiYa":
    6. return new BiYa();
    7. case "Gwm":
    8. return new Gwm();
    9. case "RedFlag":
    10. return new RedFlag();
    11. default:
    12. return null;
    13. }
    14. }
    15. @Override
    16. public Phone getPhone(String phone) {
    17. return null;
    18. }
    19. }
    1. public class PhoneFactory extends AbstractFactory {
    2. @Override
    3. public Car getCar(String car) {
    4. return null;
    5. }
    6. @Override
    7. public Phone getPhone(String phone) {
    8. switch (phone) {
    9. case "HuaWei":
    10. return new HuaWei();
    11. case "XiaoMi":
    12. return new XiaoMi();
    13. case "Apple":
    14. return new Apple();
    15. default:
    16. return null;
    17. }
    18. }
    19. }
    1. public class ProductFactory {
    2. public static AbstractFactory getFactory(String product) {
    3. switch (product) {
    4. case "CarFactory":
    5. return new CarFactory();
    6. case "PhoneFactory":
    7. return new PhoneFactory();
    8. default:
    9. return null;
    10. }
    11. }
    12. }

    <5> 编写测试类

    1. public class Test {
    2. public static void main(String[] args) {
    3. // 生产工厂的工厂实例化手机工厂
    4. AbstractFactory phoneFactory = ProductFactory.getFactory("PhoneFactory");
    5. // HuaWei
    6. Phone huaWei = Objects.requireNonNull(phoneFactory).getPhone("HuaWei");
    7. huaWei.bookPhone();
    8. // XiaoMi
    9. Phone xiaoMi = phoneFactory.getPhone("XiaoMi");
    10. xiaoMi.bookPhone();
    11. // Apple
    12. Phone apple = phoneFactory.getPhone("Apple");
    13. apple.bookPhone();
    14. System.out.println("<====================>");
    15. // 生产工厂的工厂加工汽车工厂
    16. AbstractFactory carFactory = ProductFactory.getFactory("CarFactory");
    17. // BiYa
    18. Car biYa = Objects.requireNonNull(carFactory).getCar("BiYa");
    19. biYa.bookCar();
    20. // Gwm
    21. Car gwm = carFactory.getCar("Gwm");
    22. gwm.bookCar();
    23. // RedFlag
    24. Car redFlag = carFactory.getCar("RedFlag");
    25. redFlag.bookCar();
    26. }
    27. }

    6. 运行结果

    1. Book a Huawei Phone.
    2. Book a XiaoMi Phone.
    3. Book a Apple Phone.
    4. <====================>
    5. Book a BiYa Car.
    6. Book a Gwm Car.
    7. Book a RedFlag Car.

    相信,写到这里,我们可能大概对这两种设计模式的区别心里已经有了答案,我们在这里总结一下这两种设计模式的区别和联系:

    1、工厂模式是生产单个同种类型的不同产品。

    2、抽象工厂模式是生产不同类型的多种不同产品。在抽象工厂模式种,存在一个产品族的概念,是指不同产品在结构中功能相关联的产品组成的家族,同一产品族的不同产品由同一工厂生产,不同的工厂,生产的方式( 方法 )不同,如下图所示~

    3、抽象工厂模式是对工厂模式的进一步封装,工厂模式下,只有一个抽象的产品类,对于抽象工厂模式,存在多个工厂,也就存在着多种抽象的产品类。

  • 相关阅读:
    经验笔记:Node.js 中的 process.nextTick
    在simulink中提取结构体数组的成员
    HarmonyOS 实现底部导航栏
    互联网摸鱼日报(2023-09-12)
    (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
    kubernetes之Deployment
    Redis 连接不上 WRONGPASS invalid username-password pair
    Hibernate(1)
    top命令应用(查看进程实时动态信息)
    Android assets
  • 原文地址:https://blog.csdn.net/weixin_52772307/article/details/127107425