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

相关推荐
书院门前细致的苹果13 小时前
设计模式大全:单例、工厂模式、策略模式、责任链模式
设计模式·责任链模式·策略模式
Ro Jace13 小时前
计算机专业基础教材
java·开发语言
mango_mangojuice13 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
程序员侠客行13 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
时艰.14 小时前
Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor
java·开发语言·缓存
丶小鱼丶14 小时前
并发编程之【优雅地结束线程的执行】
java
市场部需要一个软件开发岗位14 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿14 小时前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD00114 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东14 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable