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

相关推荐
凤凰院凶涛QAQ5 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛5 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1146 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
w_zero_one7 小时前
算法--模拟
java·数据结构·算法
Javatutouhouduan7 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David7 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源8 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计
秋天的怀念_David8 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
thefool1122668 小时前
网络编程^
java
Thinker QAQ9 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing