Java设计模式超详解——抽象工厂设计模式(含UML图)

一,直接上类图,初步理解抽象工厂

注:图片来源为我在浏览器里找的,看样子是csdn里的图,有水印

形象理解这张图的每个类的意思

AbstractFactory

想象一个工厂,非常全能,能够生产很多种不同的产品,这个工厂的名字就是AbstractFactory

ConcreteFactory

这个工厂要生产不同的产品,当然要开不同的产品线,确保每种产品的正常生产,于是每条生产线的名称就是ConcreteFactory,易得每条生产线都是工厂的"儿子"

AbstractProduct

客户告诉工厂,我想要一些产品,是什么产品呢,也不细说,只是告诉你这些产品有一些共同的特点,即AbstractProduct

ConcreteProduct

客户告诉工厂他所想要的具体产品,即ConcreteProduct们,要求工厂生产,工厂则根据客户想要的产品,用不同的生产线进行生产

二,题目背景

某界面可以使用不同风格的控件:按钮Button有Window风格的子类WindowButton 和Motif风格的子类树MotifButton;

文本框TextBox也有Windows风格文本框WindowsTextBox 和Motif风格的文本框MotifTextBox ,AbstractFactory 是抽象工厂接口

三,思考

思考这个问题,刚才的uml图思考:

谁是**AbstractFactory,****ConcreteFactory,****AbstractProduct,**ConcreteProduct

我们可以倒推

看题目,我们想要的最终产物有4个

WindowButton 和MotifButton

WindowsTextBox 和MotifTextBox

那这些最终产物就是ConcreteProduct

那能找到最终产物的共同特点吗? 能

Button 和TextBox

那这些共同特点就是AbstractProduct

那工厂是做什么的?

刚刚有提到:客户告诉工厂他所想要的具体产品,即ConcreteProduct们,工厂则根据客户想要的产品,用不同的生产线进行生产

所以ConcreteProduct由生产线ConcreteFactory得到

所以Button 和TextBox前面的

Window和Motif

为ConcreteFactory

那最后就是要一个工厂来包容我们的生产线ConcreteFactory,那就是AbstractFactory了

类图如下

不是很规整,但是我感觉意思应该是到位了**= ̄ω ̄=**

接下来是代码实现

AbstractProduct:

java 复制代码
abstract class Button{};

abstract class TextBox{};

ConcreteProduct:

之button

java 复制代码
class WindowButton extends Button {

    public WindowButton(){

        System.out.println("createWindowsButton");

    }

}



class MotifButton extends Button {

    public MotifButton(){

        System.out.println("createMotifButton");

    }

}

ConcreteProduct:

之Textbox

java 复制代码
class WindowTextBox extends  TextBox{

    public WindowTextBox(){

        System.out.println("createWindowTextBox");

    }

}



class MotifTextBox extends  TextBox{

    public MotifTextBox(){

        System.out.println("createMotifTextBox");

    }

}

AbstractFactory:

java 复制代码
interface AbstractFactory {

    Button createButton();

    TextBox createTextBox();

}

关键部分!!!核心,注意理解: ConcreteFactory:

java 复制代码
class WindowFactory implements AbstractFactory {
 
    public Button createButton(){
         return new WindowButton();//创建WindowButton
    }

   public TextBox createTextBox(){
       return new WindowTextBox();//创建WindowTextBox
   }
}

class Motiffactory  implements AbstractFactory {
    
    public Button createButton(){
         return new MotifButton();//创建MotifButton
    }

   public TextBox createTextBox(){
       return new MotifTextBox();//创建MotifTextBox
   }
}

客户来了:

java 复制代码
class Dialog{

    AbstractFactory factory;

    Button button;

    TextBox textBox;

    public void setFactory(AbstractFactory factory) {

        this.factory = factory;

    }

    public void init(){

        button=factory.createButton();

        textBox=factory.createTextBox();

    }

}

主函数测试:

java 复制代码
public class Main{

    public static void main(String[] args){

        Dialog dialog=new Dialog();

        dialog.setFactory(new WindowFactory());

        dialog.init();

        dialog.setFactory(new Motiffactory());

        dialog.init();

    }

    

}

(无输入)输出:

createWindowsButton
createWindowTextBox
createMotifButton
createMotifTextBox

四,同理练习(含答案无解析)

某游戏界面中冬天的场景和夏天的场景不一样,例如:树Tree有子类冬天的树WinterTree 和夏天的树SummerTree

地板Floor也有冬天的地板WinterFloor 和夏天的地板SummerFloor ,AbstractFactory 是抽象工厂接口,请实现具体的冬天工厂WinterFactory 及夏天工厂SummerFactory 。

题目代码:

java 复制代码
abstract class Tree{};

abstract class Floor{};

class WinterTree extends  Tree{

    public WinterTree(){

        System.out.println("createWinterTree");

    }

}

class SummerTree extends  Tree{

    public SummerTree(){

        System.out.println("createSummerTree");

    }

}

class WinterFloor extends  Floor{

    public WinterFloor(){

        System.out.println("createWinterFloor");

    }

}

class SummerFloor extends  Floor{

    public SummerFloor(){

        System.out.println("createSummerFloor");

    }

}

interface AbstractFactory {

    Tree createTree();

    Floor createFloor();

}



//请提交WinterFactory 及 SummerFactory 类



class GameDialog{

    AbstractFactory factory;

    Tree tree;

    Floor floor;

    public void setFactory(AbstractFactory factory) {

        this.factory = factory;

    }

    public void init(){

        tree=factory.createTree();

        floor=factory.createFloor();

    }

}



public class Main{

    public static void main(String[] args){

        GameDialog gameDialog=new GameDialog();

        gameDialog.setFactory(new WinterFactory());

        gameDialog.init();

        gameDialog.setFactory(new SummerFactory());

        gameDialog.init();

    }

    

}

答案

uml类图

代码

java 复制代码
class WinterFactory implements AbstractFactory{
    public Tree createTree(){
        return new WinterTree();
    }

    public Floor createFloor(){
        return new WinterFloor();
    }
}
class SummerFactory implements AbstractFactory{
    public Tree createTree(){
        return new SummerTree();
    }

    public Floor createFloor(){
        return new SummerFloor();
    }
}

输出

createWinterTree

createWinterFloor

createSummerTree

createSummerFloor

五,总结:抽象工厂的特点

  1. 产品族创建 :专注创建一组相关 / 配套的产品(比如 Window 风格的 Button+TextBox、Motif 风格的 Button+TextBox),而非单个产品;
  2. 抽象隔离:客户端只依赖抽象工厂 / 产品接口,不直接创建具体产品,彻底隔离创建逻辑;
  3. 风格统一 + 易切换:同一工厂产出的产品天然风格一致,切换产品族(如 Window→Motif)只需替换工厂实例,无需改客户端代码。

希望对大家有用,祝您开心~Hi~ o(* ̄▽ ̄*)ブ,有问题欢迎交流,俺会改的✊

相关推荐
非优秀程序员4 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻5 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊7 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang8 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪9 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息9 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼9 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff11 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈
SL_staff11 小时前
企业AI落地难?JVS-AI渐进式实践:安全可控、小切口验证、标准化沉淀与规模化复制
java·开源·aigc
SL_staff12 小时前
JVS数字底座实践:构建企业级统一内容管理平台的技术路径
java·产品