抽象工厂模式(Abstract Factory)

定义与类型

定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。

类型:创建型。

适用场景

  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

优点

  • 具体产品在应用层代码隔离,无须关心创建细节
  • 将一个系列的产品族统一到一起创建

缺点

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
  • 增加了系统的抽象性和理解难度

产品等级结构与产品族

在这里插入图片描述

横着来看,海尔洗衣机、海尔冰箱、海尔空调,它们都是海尔品牌,它们都属于海尔这个产品族。

竖着来看,海尔空调、美的空调、海信空调,它们都是空调,它们属于同一个产品等级结构。

工厂方法模式针对的就是产品等级结构,抽象工厂模式针对的就是产品族。

如下图所示,当一个工厂可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,使用抽象工厂模式更为简单高效。

在这里插入图片描述

抽象工厂代码示例

在这里插入图片描述

CourseFactory.java

package com.czh.creational.abstractfactory;

public interface CourseFactory {
   
    Video getVideo();
    Note getNote();
}

JavaCourseFactory.java

package com.czh.creational.abstractfactory;

public class JavaCourseFactory implements CourseFactory {
   
    @Override
    public Video getVideo() {
   
        return new JavaVideo();
    }

    @Override
    public Note getNote() {
   
        return new JavaNote();
    }
}

PythonCourseFactory.java

package com.czh.creational.abstractfactory;

public class PythonCourseFactory implements CourseFactory {
   
    @Override
    public Video getVideo() {
   
        return new PythonVideo();
    }

    @Override
    public Note getNote() {
   
        return new PythonNote();
    }
}

Video.java

package com.czh.creational.abstractfactory;

public abstract class Video {
   
    public abstract void play();
}

JavaVideo.java

package com.czh.creational.abstractfactory;

public class JavaVideo extends Video {
   
    @Override
    public void play() {
   
        System.out.println("播放Java课程视频");
    }
}

PythonVideo.java

package com.czh.creational.abstractfactory;

public class PythonVideo extends Video {
   
    @Override
    public void play() {
   
        System.out.println("播放Python课程视频");
    }
}

Note.java

package com.czh.creational.abstractfactory;

public abstract class Note {
   
    public abstract void read();
}

JavaNote.java

package com.czh.creational.abstractfactory;

public class JavaNote extends Note {
   
    @Override
    public void read() {
   
        System.out.println("阅读Java课程笔记");
    }
}

PythonNote.java

package com.czh.creational.abstractfactory;

public class PythonNote extends Note {
   
    @Override
    public void read() {
   
        System.out.println("阅读Python课程笔记");
    }
}

Test.java

package com.czh.creational.abstractfactory;

public class Test {
   
    public static void main(String[] args) {
   
        CourseFactory courseFactory1 = new JavaCourseFactory();
        Video video1 = courseFactory1.getVideo();
        Note note1 = courseFactory1.getNote();
        video1.play();
        note1.read();

        CourseFactory courseFactory2 = new PythonCourseFactory();
        Video video2 = courseFactory2.getVideo();
        Note note2 = courseFactory2.getNote();
        video2.play();
        note2.read();
    }
}

相关推荐

  1. [go] 抽象工厂模式

    2024-01-05 21:14:03       31 阅读
  2. 设计模式 抽象工厂

    2024-01-05 21:14:03       25 阅读
  3. 抽象工厂模式

    2024-01-05 21:14:03       19 阅读
  4. 设计模式抽象工厂

    2024-01-05 21:14:03       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-05 21:14:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-05 21:14:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-05 21:14:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-05 21:14:03       18 阅读

热门阅读

  1. python基础教程六(字典方法)

    2024-01-05 21:14:03       35 阅读
  2. Spring之推断构造方法

    2024-01-05 21:14:03       27 阅读
  3. 电商API连接升级:飞书集成助力营销系统

    2024-01-05 21:14:03       37 阅读
  4. How to collect data

    2024-01-05 21:14:03       46 阅读
  5. 中华人民共和国海关总署下载179号数据对接

    2024-01-05 21:14:03       43 阅读
  6. docker实战:安装redis

    2024-01-05 21:14:03       43 阅读
  7. while循环

    2024-01-05 21:14:03       39 阅读
  8. Leetcode 超难题目 Hard

    2024-01-05 21:14:03       39 阅读
  9. 前端深拷贝

    2024-01-05 21:14:03       35 阅读
  10. Linux 网络工具

    2024-01-05 21:14:03       36 阅读