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

相关推荐
钱多多_qdd4 小时前
mini-spring基础篇:IoC(十一):Aware接口
java·spring
ZouZou老师4 小时前
C++设计模式之单例模式:以小区快递柜为例
c++·单例模式·设计模式
嵌入式小能手4 小时前
飞凌嵌入式ElfBoard-文件I/O的深入学习之文件锁
java·服务器·学习
职业码农NO.14 小时前
智能体AI的六大核心设计模式,很常见
人工智能·设计模式·系统架构·aigc·rag
Predestination王瀞潞4 小时前
Java EE开发技术 (报错解决 请求的资源[/Bank/$%7BpageContext.request.contextPath%7D/login]不可用)
java·java-ee
小鱼小鱼.oO4 小时前
Agent 设计模式
设计模式
Sahadev_4 小时前
GitHub 一周热门项目速览 | 2025年12月08日
java·大数据·人工智能·安全·ai作画
Jaxson Lin4 小时前
Java编程进阶:打造专属于你的背单词软件V1.0
java·开发语言
7ioik4 小时前
什么是栈帧?
java