java设计模式-抽象工厂设计模式

本文深入探讨了抽象工厂设计模式,一种提供创建一组相关或相互依赖对象接口的设计模式,无需指定具体类即可得到同族的不同等级产品。文章通过实例详细解释了其工作原理,优势及应用场景,特别适用于管理产品族中相关联的多等级产品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java设计模式-抽象工厂设计模式

简单说一下

前面我们说过工厂方法模式以及简单工厂模式,那么接下来我们聊下抽象工厂设计模式:抽象工厂设计模式是一种为访问类提供一个创建一组相关或者相互依赖对象的接口,且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。话句话说在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类。

如果以上定义你还是不理解的话,那我们还是举个栗子:比如某个程序员突然要回家开垦自己的一亩三分地,在这快一亩三分地,他想养马、养牛、养羊,种花,种草,种黄瓜等,这无疑在类的实例化方面操作比较复杂,所以必须用抽象工厂模式来设计两块地,一块地养牲畜,一块地种植物,即可以在以上两块地定义牲畜new Animal()和植物new Plant()方法。

用精致的话一句话说:抽象工厂设计模式就是抽出来像的部分,简化多类复杂的操作。

顺便提一下

我们前边所说到的工厂方法模式考虑的只是一类产品的生产,如畜牧场只养动物,自行车厂只生产自行车,手机制造厂只生产手机。也就是说工厂方法模式只考虑生产同等级的产品。

但是抽象工厂设计模式是考虑等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,比如农场里既养动物又种植物,大学既有软件专业又有视频专业等。

一图走天下(网上当的):
在这里插入图片描述

简单夸一下

抽象工厂模式是工厂方法模式的升级版,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

优点如下:
1.可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
2.当增加一个新的产品族时不需要修改原代码,满足开闭原则。

狠狠吐一下

缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

多多用一下

先配一张网上当的结构图:
在这里插入图片描述

代码实现(还是用之前提到的Shape类举例)

1.创建形状一个接口Shape.java

public interface Shape {
    void draw();
}

2.创建实现形状接口的实体类Circle.java\Square.java\Rectangle.java

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是一个圆形");
    }
}
-------------------------------------------
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("这是一个正方形");
    }
}
-------------------------------------------
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("这是一个长方形");
    }
}

3.创建一个颜色接口Color.java

public interface Color {
    void fill();
}

4.创建实现颜色接口的实体类Red.java\Green.java\Blue.java

public class Red implements Color {
    @Override
    public void fill() {
        System.out.println("这是红色");
    }
}
----------------------------------------------
public class Green implements Color {
    @Override
    public void fill() {
        System.out.println("这是绿色");
    }
}
----------------------------------------------
public class Blue implements Color {
    @Override
    public void fill() {
        System.out.println("这是蓝色");
    }
}

5.为Shape和Color对象创建抽象类来获取工厂AbstractFactory.java

public abstract class AbstractFactory {
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape);
}

6.创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象ShapeFactory.java\ColorFactory.java

public class ShapeFactory extends AbstractFactory{
    @Override
    public Color getColor(String color) {
        return null;
    }

    public Shape getShape(String shapeType){
        if(shapeType == null){
            return null;
        }
        if(shapeType.equalsIgnoreCase("circle")){
            return new Circle();
        }else if(shapeType.equalsIgnoreCase("square")){
            return new Square();
        }else if(shapeType.equalsIgnoreCase("rectangle")){
            return new Rectangle();
        }
        return null;
        /*equalsIgnoreCase:和equals的区别是不需要考虑字符大小写*/
    }
}
---------------------------------------------------------
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
    if(color==null){
        return null;
    }
    if(color.equalsIgnoreCase("red")){
        return new Red();
    }else if(color.equalsIgnoreCase("green")){
        return new Green();
    }else if (color.equalsIgnoreCase("blue")){
        return new Blue();
    }
    return null;
}
   @Override
    public Shape getShape(String shape) {
        return null;
    }
}

7.创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂FactoryProducer .java

public class FactoryProducer {
    public static AbstractFactory getFactory(String choice){
        if(choice.equalsIgnoreCase("shape")){
            return new ShapeFactory();
        }else if(choice.equalsIgnoreCase("color")){
            return new ColorFactory();
        }
        return null;
    }
}

8.使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象AbstractFactoryPattern.java

public class AbstractFactoryPattern {
    public static void main(String[] args) {
        /*获取形状工厂*/
        AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
        /*获取形状为Circle的对象*/
        Shape shape1 = shapeFactory.getShape("circle");
        /*调用Circle的draw方法*/
        shape1.draw();

        /*获取颜色工厂*/
        AbstractFactory colorFactory = FactoryProducer.getFactory("color");
        /*获取颜色为Red的对象*/
        Color color1 = colorFactory.getColor("red");
        /*调用Red的fill方法*/
        color1.fill();
    }
}

9.运行结果

这是一个圆形
这是红色
### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值