【设计模式】抽象工厂模式

抽象工厂模式介绍

抽象工厂模式:模式介绍

抽象工厂模式和工厂方法模式区别为: 工厂方法模式的工厂只能创建单一产品,抽象工厂模式的工厂可以创建多个产品(一类产品即产品簇)。此示例中,分别有两个具体工厂,分别为现代风格家具工厂和维多利亚风格家具工厂。现代风格家具工厂可以生产多种现代风格的家具,分别为现代风格的椅子、沙发、咖啡桌;维多利亚风格家具工厂可以生产多种维多利亚风格家具,分别为维多利亚风格的椅子、沙发、咖啡桌。

模式代码实现

产品

Chair

chair/Chair.java

package abstract_factory.chair;

/**
 * 椅子接口
 */
public interface Chair {
    void hasLeg();
}

chair/ModernChair.java

package abstract_factory.chair;

/**
 * 现代风格椅子
 */
public class ModernChair implements Chair {
    @Override
    public void hasLeg() {
        System.out.println("Modern chair has no leg.");
    }
}

chair/VictoriaChair.java

package abstract_factory.chair;

/**
 * 维多利亚风格椅子
 */
public class VictoriaChair implements Chair {
    @Override
    public void hasLeg() {
        System.out.println("Victoria chair has leg.");
    }
}

Sofa

sofa/Sofa.java

package abstract_factory.sofa;

/**
 * 沙发接口
 */
public interface Sofa {
    void sitOn();
}

sofa/ModernSofa.java

package abstract_factory.sofa;

/**
 * 现代风格沙发
 */
public class ModernSofa implements Sofa {
    @Override
    public void sitOn() {
        System.out.println("Modern sofa sit on.");
    }
}

sofa/VictoriaSofa.java

package abstract_factory.sofa;

/**
 * 维多利亚风格沙发
 */
public class VictoriaSofa implements Sofa {
    @Override
    public void sitOn() {
        System.out.println("Victory sofa sit on.");
    }
}

Coffee Table

coffee_table/CoffeeTable.java

package abstract_factory.coffee_table;

/**
 * 咖啡桌接口
 */
public interface CoffeeTable {
    void putCoffee();
}

coffee_table/ModernCoffeeTable.java

package abstract_factory.coffee_table;

/**
 * 现代风格咖啡桌
 */
public class ModernCoffeeTable implements CoffeeTable {
    @Override
    public void putCoffee() {
        System.out.println("Modern coffee table put coffee.");
    }
}

coffee_table/VictoriaCoffeeTable.java

package abstract_factory.coffee_table;

/**
 * 维多利亚风格咖啡桌
 */
public class VictoriaCoffeeTable implements CoffeeTable {
    @Override
    public void putCoffee() {
        System.out.println("Victoria coffee table put coffee.");
    }
}

工厂

factory/FurnitureFactory.java

package abstract_factory.factory;

import abstract_factory.chair.Chair;
import abstract_factory.coffee_table.CoffeeTable;
import abstract_factory.sofa.Sofa;

/**
 * 抽象家具工厂
 */
public interface FurnitureFactory {
    Chair createChair();
    CoffeeTable createCoffeeTable();
    Sofa createSofa();
}

factory/ModernFurnitureFactory.java

package abstract_factory.factory;

import abstract_factory.chair.Chair;
import abstract_factory.chair.ModernChair;
import abstract_factory.coffee_table.CoffeeTable;
import abstract_factory.coffee_table.ModernCoffeeTable;
import abstract_factory.factory.FurnitureFactory;
import abstract_factory.sofa.ModernSofa;
import abstract_factory.sofa.Sofa;

/**
 * 现代风格家具工厂
 */
public class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ModernChair();
    }

    @Override
    public CoffeeTable createCoffeeTable() {
        return new ModernCoffeeTable();
    }

    @Override
    public Sofa createSofa() {
        return new ModernSofa();
    }
}

factory/VictoriaFurnitureFactory.java

package abstract_factory.factory;

import abstract_factory.chair.Chair;
import abstract_factory.chair.VictoriaChair;
import abstract_factory.coffee_table.CoffeeTable;
import abstract_factory.coffee_table.VictoriaCoffeeTable;
import abstract_factory.factory.FurnitureFactory;
import abstract_factory.sofa.Sofa;
import abstract_factory.sofa.VictoriaSofa;

/**
 * 维多利亚风格家具工厂
 */
public class VictoriaFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new VictoriaChair();
    }

    @Override
    public CoffeeTable createCoffeeTable() {
        return new VictoriaCoffeeTable();
    }

    @Override
    public Sofa createSofa() {
        return new VictoriaSofa();
    }
}

测试

测试代码

package abstract_factory;

import abstract_factory.chair.Chair;
import abstract_factory.coffee_table.CoffeeTable;
import abstract_factory.factory.FurnitureFactory;
import abstract_factory.factory.ModernFurnitureFactory;
import abstract_factory.factory.VictoriaFurnitureFactory;
import abstract_factory.sofa.Sofa;

/**
 * 测试类
 */
public class Main {
    public static void main(String[] args) {
        // 创建现代风格家具
        FurnitureFactory furnitureFactory1 = new ModernFurnitureFactory();
        Chair chair1 = furnitureFactory1.createChair();
        chair1.hasLeg();
        CoffeeTable coffeeTable1 = furnitureFactory1.createCoffeeTable();
        coffeeTable1.putCoffee();
        Sofa sofa1 = furnitureFactory1.createSofa();;
        sofa1.sitOn();

        // 创建维多利亚风格家具
        FurnitureFactory furnitureFactory2 = new VictoriaFurnitureFactory();
        Chair chair2 = furnitureFactory2.createChair();
        chair2.hasLeg();
        CoffeeTable coffeeTable2 = furnitureFactory2.createCoffeeTable();
        coffeeTable2.putCoffee();
        Sofa sofa2 = furnitureFactory2.createSofa();
        sofa2.sitOn();
    }
}

测试结果
在这里插入图片描述

参考

[1] REFACTORING.GURU.抽象工厂模式

### 卷积神经网络层可视化的绘制方法 #### 使用 Keras 进行中间激活的可视化 通过加载预训练模型并提取特定层的输出,可以实现对卷积神经网络中间激活的可视化。这种方法能够展示每一层如何逐步转换输入数据[^1]。 以下是基于 Keras 实现的一个简单代码示例: ```python import numpy as np from tensorflow import keras from matplotlib import pyplot as plt # 加载预训练模型(假设是一个简单的 CNN) model = keras.models.load_model('cats_dogs_cnn.h5') # 提取某一层的输出作为特征 layer_outputs = [layer.output for layer in model.layers[:8]] # 假设前8层是卷层 activation_model = keras.models.Model(inputs=model.input, outputs=layer_outputs) # 输入一张片进行预测 img_path = 'cat_or_dog.jpg' img = keras.preprocessing.image.load_img(img_path, target_size=(150, 150)) img_tensor = keras.preprocessing.image.img_to_array(img) img_tensor = np.expand_dims(img_tensor, axis=0) # 添加 batch 维度 img_tensor /= 255. activations = activation_model.predict(img_tensor) # 显示第4层的特征 first_layer_activation = activations[3] plt.matshow(first_layer_activation[:, :, 4], cmap='viridis') # 显示第4张特征 plt.show() ``` 上述代码展示了如何从指定层中提取特征,并将其绘制成二维矩阵像。 --- #### 利用专用工具绘制卷积神经网络结构 除了直接显示中间激活外,还可以利用一些专门设计用于绘制卷积神经网络架构的工具来帮助理解整个网络结构[^3]。这些工具有助于更直观地观察每层之间的连接关系以及参数变化情况。 - **NN-SVG**: 提供在线界面自动生成高质量的神经网络图表。 - **ConvNetDraw**: 支持交互式的神经网络构建与渲染功能。 - **PlotNeuralNet**: 是一种 LaTeX 宏包形式的解决方案,适合科研论文撰写过程中嵌入复杂形描述。 下面给出 PlotNeuralNet 的基本语法框架实例: ```latex \documentclass{article} \usepackage{tikz} \usetikzlibrary{positioning} % Define layers and connections here... \tikzstyle{connection}=[ultra thick,every node/.style={sloped,allow upside down}] \begin{document} \begin{tikzpicture}[x=1cm,y=-1.5cm] % Draw input/output nodes etc. \node (I1) at (0,0) {Input}; \node[right=of I1] (H1) {Hidden Layer}; \draw[->, connection] (I1) -- node {\midarrow} (H1); % Add more layers similarly... \end{tikzpicture} \end{document} ``` 此段脚本定义了一个非常基础版本的两节点间连线示意。 --- #### 类激活热力生成技术简介 另一种重要的可视化手段就是创建类激活热力(Class Activation Heatmaps),它揭示了哪些区域最能影响最终决策结果[^2]。具体做法通常是采用梯度加权方式计算全局平均池化后的响应强度分布状况。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值