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(* ̄▽ ̄*)ブ,有问题欢迎交流,俺会改的✊

相关推荐
维天说2 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19943 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充4 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充4 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了4 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品4 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘4 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记5 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵5 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室6 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发