抽象工厂设计模式-设计模式

    技术2025-09-10  60

    目录

    1、概述

    优点:

    缺点:

    产品族:

    2、代码实现

    3、源码应用场景 


    1、概述

    抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,无需指定要创建的类,只需要指定一个抽象工厂类,由该工厂类实现所有相关对象的创建。

    优点:

    将一系列的产品族统一到一起创建。

    缺点:

    规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。

    增加了系统的抽象性和理解难度。

    产品族:

    所谓的产品族,指的是一些产品的集合,常常是为了一个目的或实现一个功能点,所需要的一些类,把这些类整合到一起,由一个类控制产生一堆类的对象。比如,对于Java知识来说,根据不同的表现记载形式,有Java视频、Java博客、Java图书、Java音频,等等,这些就可以组成一个产品族。

     

    2、代码实现

    https://github.com/phs999/DesignPatterns/tree/900968a8a27e79e5b4df3bb167493f93917f292b/design_pattern/src/creational/abstractfactory

    package creational.abstractfactory; public interface CourseFactory { Video getVideo(); Aticle getArticle(); }

    我们看到抽象工厂核心的Interface CourseFactory中的返回值Video和Article也都是抽象类或接口。

    package creational.abstractfactory; public class JavaCourceFactory implements CourseFactory{ @Override public Video getVideo() { return new JavaVideo(); } @Override public Aticle getArticle() { return new JavaArticle(); } } package creational.abstractfactory; public class JavaVideo extends Video { @Override public void produce() { System.out.println("录制Java课程视频"); } }

     

    package creational.abstractfactory; public class JavaArticle extends Article { @Override public void produce() { System.out.println("编写Java课程文章"); } } package creational.abstractfactory; public class Test { public static void main(String[] args) { CourseFactory courseFactory = new JavaCourceFactory(); Video video = courseFactory.getVideo(); video.produce(); } }

     


    3、源码应用场景 

    在MyBatis中,SqlSessionFactory工厂,实现了SqlSession和Configuration两种对象的创建,这两种具体实现对象属于一个产品族。

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.apache.ibatis.session; import java.sql.Connection; public interface SqlSessionFactory { SqlSession openSession(); SqlSession openSession(boolean var1); SqlSession openSession(Connection var1); SqlSession openSession(TransactionIsolationLevel var1); SqlSession openSession(ExecutorType var1); SqlSession openSession(ExecutorType var1, boolean var2); SqlSession openSession(ExecutorType var1, TransactionIsolationLevel var2); SqlSession openSession(ExecutorType var1, Connection var2); Configuration getConfiguration(); }

     

    Processed: 0.008, SQL: 9