设计模式之抽象工厂模式

C++设计模式——Abstract Factory Pattern抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种将相关/依赖对象组合在一起创建的方式,而无需指定它们的具体类。抽象工厂模式与工厂方法模式的区别:工厂方法模式将对象的创建过程延迟到子类中,允许用户通过一个统一的接口来请求他们想要的具体产品,而无需知道产品的具体实现。在这个模式中,工厂类只负责生产同一系列的产品,但具体哪种产品由子类决定。抽象工厂模式更进一步,它提供了一个接口,用于创建一系列相关的或相互依赖的对象,而不是单一对象。 阅读详情

什么是抽象工厂模式

    抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类。该模式属于创建型设计模式。。
    抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂中的具体工厂不只是创建一个产品,而是创建一组产品。
    在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于生产多种不同的产品,这些产品组成一个产品组。
    在工厂方法模式中具体工厂只负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性。一般情况下,一个具体工厂只有一个或一组重载的工厂方法。
    抽象工厂模式包含一下几个角色:
        AbstractFactory(抽象工厂):声明了一组用于创建一组产品的方法,每一个方法对应一种产品。
        ConcreteFactory(具体工厂):实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品组。
        AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
        ConcreteProduct(具体产品):定义了具体工厂生产的具体产品的对象,实现抽象产品接口中声明的业务方法。
    在抽象工厂中声明多个工厂方法,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或具体类(可能有很多初学者认为抽象工厂模式就是定义抽象类,其实不然,这是一个误区!)
    具体工厂实现了抽象工厂,每一个具体的工厂方法可以返回一个特定的产品对象,而同一个具体工厂所创建的产品对象构成了产品组。

抽象工厂模式的优缺点

优点

  1. 抽象工厂模式隔离了具体类的生成,我们可以很容易的切换一个具体工厂。
  2. 当一个产品组中的多个对象设计到一起时,能够保证同时只能使用同一个产品组中的一个对象。
  3. 新增产品组很方便,符合开闭原则。

缺点

  1. 增加新的产品等级结构比较麻烦,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加新的产品方法,不符合开闭原则。

  2. 抽象工厂模式的应用场景

  3. 一个系统不应该依赖于产品类如何被创建,组合和表达的细节

  4. 系统中有多个产品组,而每次只使用其中一个

抽象工厂模式案例

/**
 * 创建蔚小理的抽象工厂,分SUV和轿车
 */
public abstract class AbstractCardFactory {
    // 买SUV
    public abstract SUV orderSUV();
    // 买轿车
    public abstract LittleCar orderLittleCar();

}

--------------------------------------------------------------------------------

/**
 * 蔚来车具体工厂
 */
public class NIOCarFactory extends AbstractCardFactory {
    @Override
    public SUV orderSUV() {
        return new NIOSUV();
    }

    @Override
    public LittleCar orderLittleCar() {
        return new NIOLittleCar();
    }
}

/**
 * 理想车具体工厂
 */
public class ONECarFactory extends AbstractCardFactory {

    @Override
    public SUV orderSUV() {
        return new ONESUV();
    }

    @Override
    public LittleCar orderLittleCar() {
        return new ONELittleCar();
    }

}

/**
 * 小鹏车具体工厂
 */
public class XPCarFactory extends AbstractCardFactory {

    @Override
    public SUV orderSUV() {
        return new XPSUV();
    }

    @Override
    public LittleCar orderLittleCar() {
        return new XPLittleCar();
    }
}

--------------------------------------------------------------------------------

/**
 * 轿车抽象产品
 */
public interface LittleCar {

    void buy();

}


/**
 * SUV 抽象产品
 */
public interface SUV {

    void buy();

}
--------------------------------------------------------------------------------

/**
 * 蔚来轿车具体产品
 */
public class NIOLittleCar implements LittleCar {
    @Override
    public void buy() {
        System.out.println("购买蔚来轿车");
    }
}

/**
 * 理想轿车具体产品
 */
public class ONELittleCar implements LittleCar {
    @Override
    public void buy() {
        System.out.println("购买理想轿车");
    }
}

/**
 * 小鹏轿车具体产品
 */
public class XPLittleCar implements LittleCar {
    @Override
    public void buy() {
        System.out.println("购买小鹏轿车");
    }
}

/**
 * 蔚来SUV具体产品
 */
public class NIOSUV implements SUV {

    @Override
    public void buy() {
        System.out.println("购买蔚来SUV");
    }

}

/**
 * 理想SUV具体产品
 */
public class ONESUV implements SUV {
    @Override
    public void buy() {
        System.out.println("购买理想SUV");
    }
}

/**
 * 小鹏SUV具体产品
 */
public class XPSUV implements SUV {

    @Override
    public void buy() {
        System.out.println("购买小鹏SUV");
    }

}

--------------------------------------------------------------------------------

public class Test {

    public static void main(String[] args) {
        // 选择理想
        ONECarFactory oneCarFactory = new ONECarFactory();
        // 购买理想SUV
        oneCarFactory.orderSUV().buy();
        // 选择蔚来
        NIOCarFactory nioCarFactory = new NIOCarFactory();
        // 购买蔚来SUV
        nioCarFactory.orderSUV().buy();

    }
}

在这里插入图片描述

抽象工厂在源码中的应用

JDBC

// Connection 接口是一个经典的抽象工厂
// Statement、PreparedState、CallableStatement 就是 Connection 这个抽象工厂中提供的三个抽象产品

// 抽象工厂
public interface Connection  extends Wrapper, AutoCloseable {
    // 创建sql的执行对象
    Statement createStatement() throws SQLException;
    // 创建支持预编译的sql执行对象
    PreparedStatement prepareStatement(String sql) throws SQLException;
    // 创建支持存储过程的sql执行对象
    CallableStatement prepareCall(String sql) throws SQLException;    
}

// 具体工厂
public class ConnectionImpl implements JdbcConnection, SessionEventListener, Serializable {
    @Override
    public java.sql.Statement createStatement() throws SQLException {
        return createStatement(DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY);
    }
    
    @Override
    public java.sql.PreparedStatement prepareStatement(String sql) throws SQLException {
        return prepareStatement(sql, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY);
    }
    
    @Override
    public java.sql.CallableStatement prepareCall(String sql) throws SQLException {
        return prepareCall(sql, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY);
    }
}


// 抽象产品
public interface Statement extends Wrapper, AutoCloseable {
    // 执行查询方法
    ResultSet executeQuery(String sql) throws SQLException;
    // 执行更新方法
    int executeUpdate(String sql) throws SQLException;

}

public interface PreparedStatement extends Statement {
    // 执行查询方法
    ResultSet executeQuery() throws SQLException;
    
    // 执行更新方法
    int executeUpdate() throws SQLException;
}

public interface CallableStatement extends PreparedStatement {
    // 注册存储过程出参
    void registerOutParameter(int parameterIndex, int sqlType) throws SQLException;
}

// 具体工厂
public class StatementImpl implements JdbcStatement {
    @Override
    public java.sql.ResultSet executeQuery(String sql) throws SQLException {
        synchronized (checkClosed().getConnectionMutex()) {
            JdbcConnection locallyScopedConn = this.connection;
    
            this.retrieveGeneratedKeys = false;
    
            checkNullOrEmptyQuery(sql);
    
            resetCancelledState();
    
            implicitlyCloseAllOpenResults();
            
            ......
            return this.results;
        }
    }
    ......
}

public class ClientPreparedStatement extends com.mysql.cj.jdbc.StatementImpl implements JdbcPreparedStatement {
    @Override
    public java.sql.ResultSet executeQuery() throws SQLException {
        synchronized (checkClosed().getConnectionMutex()) {
    
            JdbcConnection locallyScopedConn = this.connection;
    
            checkForDml(((PreparedQuery<?>) this.query).getOriginalSql(), ((PreparedQuery<?>) this.query).getParseInfo().getFirstStmtChar());
    
            this.batchedGeneratedKeys = null;
    
            resetCancelledState();
    
            implicitlyCloseAllOpenResults();
    
            clearWarnings();
            ......
            return this.results;
        }
    }
    ......
}

public class CallableStatement extends ClientPreparedStatement implements java.sql.CallableStatement {
    @Override
    public void registerOutParameter(int parameterIndex, int sqlType) throws SQLException {
        try {
            MysqlType mt = MysqlType.getByJdbcType(sqlType);
            registerOutParameter(parameterIndex, mt);
        } catch (FeatureNotAvailableException nae) {
            throw SQLError.createSQLFeatureNotSupportedException(Messages.getString("Statement.UnsupportedSQLType") + JDBCType.valueOf(sqlType),
                    MysqlErrorNumbers.SQL_STATE_DRIVER_NOT_CAPABLE, getExceptionInterceptor());
        }
    }
    ......
}

在这里插入图片描述


【愚公系列】二十三种设计模式(二)-抽象工厂模式(Abstract Factory Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

相关推荐

防火墙——双机热备理论讲解

本端和对端协商失败。有可能是因为本端和对端设备的软件版本不一致、某端配置错误、对端设备的心跳接口状态为Down、HRP源或目的端口号被修改、或者底层链路不通等原因导致。会话表、SeverMap表、IP监控表、分片缓存表、GTP表、黑名单、PAT方式端口映射表、NO-PAT方式地址映射表。两台设备一主一备,正常情况下业务流量由主设备处理,当主设备故障时,业务流量平滑切换到备用设备进行处理,业务不中断。开启自动备份后,当主用设备配置了一条可备份的命令或产生了可备份的会话表状态时,会直接备份到备用设备上。

m0_49864110的博客 2万+

设计模式 | 抽象工厂模式及典型应用

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 在抽象工厂模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品。 角色 在抽象工厂模式包含如下几个角色: AbstractFactory(抽象工厂):它声明了一组用于创建一族产品...

weixin_34088583的博客 419

非球面检测

摘要:非球面镜检测主要采用干涉法,包括零位补偿和非零位补偿两种方式。零位补偿通过透镜组完全校正像差,精度达1%波长,但设计复杂成本高;非零位补偿利用部分像差补偿降低波前斜率,适用于规则非球面。折射-衍射混合补偿镜能同时校正多种像差。实际检测中可采用物理补偿镜或动态CGH加载方案,光路设计需运用坐标断点和多重结构技术实现复杂光路建模。不同方法各具优势,需根据检测需求选择合适方案。

Zhaxibamao的博客 2106

抽象工厂模式(实现+总结+改进)

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或互相依赖对象的的接口,而无需指定它们具体的类。 下面用更换数据库的例子来详细讲解抽象工厂模式 比如说我们本来用的是SQL Server来存储数据,因为特殊要求要更换成Oracle,这时候就需要改动我们原本写好的代码了,但学习完抽象工厂模式之后能够使这种改动最小化。 首先,下面先用工厂方法模式实现一遍,以便于看出抽象工厂模式的...

lkkk的博客 2838

室内无人机自主定位:融合Mid360激光雷达与光流传感器的无GPS导航实践

本文详细介绍了室内无人机自主定位技术,通过融合Mid360激光雷达与光流传感器实现无GPS导航。文章分析了技术挑战、硬件配置、算法优化及实战调试,展示了在复杂室内环境中如何实现厘米级定位精度,为仓库巡检、隧道勘测等场景提供可靠解决方案。

weixin_30500105的博客 532

ROS1集群通信的可靠升级方案:为什么在无线环境下我选择了swarm_ros_bridge而非原生DDS

本文探讨了ROS1集群通信在无线环境下的可靠升级方案,重点分析了swarm_ros_bridge相较于原生DDS的优势。通过实际案例和性能对比,展示了ZeroMQ在无线通信中的稳定性和高效性,特别适合无人机编队和移动机器人集群等场景。

weixin_42567279的博客 386

23种设计模式之抽象工厂模式(Abstract Factory Pattern)

本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

别再死记硬背了!用TwinCAT 3手把手教你配置EtherCAT伺服驱动的PDO映射(DS402协议)

本文详细介绍了如何使用TwinCAT 3配置EtherCAT伺服驱动的PDO映射(DS402协议),涵盖环境准备、设备扫描、PDO映射实战及高级技巧。通过具体操作步骤和常见问题排查,帮助工程师快速掌握EtherCAT通信配置,提升运动控制系统的效率和稳定性。

weixin_29185493的博客 321

设计模式-抽象工厂模式(Abstract Factory Pattern)

设计模式-抽象工厂模式(Abstract Factory Pattern)

weixin_45226668的博客 997

NVIDIA Jetson Xavier NX刷机+ROS安装+深度学习配置

.NVIDIA Jetson Xavier NX 完整说明流程 V1.0.0 – by Holden Date : 2021-03-19 文章目录.NVIDIA Jetson Xavier NX 完整说明流程1. Jetson Xavier NX简介2. Jetson Xavier NX刷机介绍2.1 工具准备工作2.2 下载镜像以及烧录工具2.3 烧录原生镜像到TF卡2.4 开机启动2.5 组件配置4. 镜像克隆制作5. 镜像重烧写6. NX调控命令 1. Jetson Xavier NX简介 ​ NVI

李老板Holden的博客 7618

数学建模灵敏性分析(一阶、二阶灵敏度)python代码+懒人专用版

对于勉强看懂了灵敏度分析的同学来说,本文给出一个方便移植、修改的python程序,可以很方便地进行灵敏度分析。

春江花朝秋月夜 1万+

【设计模式】——抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是所有形态的工厂模式中最抽象和最具一般性的一种。它适用于处理具有产品族(即一组相互关联或相互依赖的产品)的产品结构。产品族是指位于不同等级结构中的一组产品,它们之间可能存在一定的依赖或约束关系。抽象工厂模式通过定义一个接口,使得客户端可以在不必指定具体产品的情况下,创建多个产品族中的产品对象。

J^T的博客 2362

【YOLO26科研级突破】集成BiFPN双向特征金字塔,让多尺度特征融合效率与精度双跃升

打开确保模型解析器能识别BiFPN模块。通过将BiFPN双向特征金字塔集成到YOLO26中,我们实现了一个“全尺度双向特征流动+加权融合+精准检测”的目标检测模型。这个改进不仅在工程上能大幅提升多尺度、复杂场景下的检测精度,更在科研上提供了“双向特征融合”的创新思路——这种思路可以延伸到其他检测网络(如Faster R-CNN、SSD)的Neck模块改进中,帮你在论文中打造独特的研究点。

LXY_LOVE36的博客 200

设计模式系列(六)抽象工厂模式(Abstract Factory Pattern)

设计模式系列(五)抽象工厂模式(Abstract Factory Pattern)     抽象工厂模式

君临天下的博客 991

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

设计模式中的抽象工厂模式(Abstract Factory Pattern)

在软件开发中,经常需要创建一组相关的对象,并希望这些对象能够在不同的产品族之间互相兼容。如果直接在代码中实例化具体类,会导致代码耦合、难以扩展、违反开闭原则(OCP)。抽象工厂模式(Abstract Factory Pattern)提供了一种创建一组相关或依赖对象的接口,而无需指定它们的具体类,从而提高代码的灵活性和可维护性。本文将详细介绍抽象工厂模式的概念、应用场景,并通过 Python 代码示例展示其实现方式。

1106

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java设计模式 四 抽象工厂模式 (Abstract Factory Pattern)

是一种创建型设计模式,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式为产品族的创建提供了一个接口,其核心在于解决“产品族的扩展”和“客户端与具体工厂的解耦”。

空 854

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

秒懂设计模式之抽象工厂模式(Abstract Factory Pattern)

前言 人在IT江湖飘,不懂设计模式咋装逼? 三种工厂模式均为创建型模式,即讨论的是如何创建一个类的对象的问题。说到底就是以各种装逼的方式最终将一个类的对象new出来。没有什么神秘的,如果你发现你需要一个类的对象而你又不会这些装逼神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不了永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装逼神器! 定...

ShuSheng007的程序人生 7077

设计模式之抽象工厂模式(Abstract Factory Pattern)

一、抽象工厂模式的由来   抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式。例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要把按钮和窗体统一切换成Linux风格的。如何统一进行调换呢?于是就有人设计出了,windows是一个工厂,生产windows的窗体和按钮,Linux是一个工厂,生产Linux的窗体和按钮,通过切换工厂,来整体切换按钮和窗体风格。 看了上面的描述,是不是感觉说了一堆废话呢?????其实抽象工厂模式是从工厂方法

敲代码的小小酥的博客 522

23种设计模式——抽象工厂模式(Abstract Factory Pattern)详解

本文介绍了23种设计模式之——抽象工厂模式(Abstract Factory Pattern)的说明及使用

Meteors.的博客 1246

设计模式—抽象工厂模式(Abstract Factory Pattern)

动机 在了解动机之前,先回顾一下工厂方法模式: 在工厂方法模式中,工厂类都是对单一产品对象进行操作,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。 问题:如果想要一个工厂对多个产品对象进行操作,而不是只对单一产品进行操作,那么工厂方法模式就会变得很复杂,如何解决呢? 当系统所提供的工厂所需生产的具体产品并不是一个单一产品,而是多个位于不同继承结构之间的不同类型的产品组成的产品族,这时候就需要使用到抽象工厂模式。 继承结构:如一

gcdqwer的博客 304

设计模式精讲 Day 3:抽象工厂模式(Abstract Factory Pattern)

在面向对象设计中,抽象工厂模式是一种用于创建一系列相关或依赖对象的接口,而无需指定它们具体的类。它属于创建型模式,是工厂方法模式的进一步抽象和扩展。本节将围绕抽象工厂模式展开,分析其核心思想、结构组成、使用场景以及在实际项目中的价值。抽象工厂模式提供了一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。它封装了多个工厂方法,使得客户端可以统一地创建不同产品的家族。核心思想:将对象的创建逻辑封装到一个工厂接口中,客户端通过调用该接口获取产品,而不是直接实例化具体类。今天,我们深入学习了。

在未来等你的专栏 1126

设计模式三:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体实现类。在软件开发中,有时候需要根据不同的条件或环境来创建一组相关的对象。抽象工厂模式将对象的创建逻辑封装在一个抽象工厂接口中,该接口声明了一系列用于创建不同类型对象的方法。具体的工厂类实现了这个接口,每个具体工厂类负责创建一组相关的对象。

qq_40537587的博客 786

设计模式 抽象工厂模式(Abstract Factory Pattern)

设计模式 抽象工厂模式(Abstract Factory Pattern) 一、简述 抽象工厂模式:定义一个创建一些列相关或相互依赖的对象接口,而无需指定它们具体的类。 对比工厂方法模式:(简历举例) 工厂方法模式是 多个工厂,一个工厂创建一个单一的产品。 抽象工厂模式是 多个工厂,一个工厂创建一些相关的产品(比如生产同一个牌子的上衣和裤子、比如生产同一系列但不同款式的衣服) 例子打包:例子打包:外链:https://wwa.lan...

Genven_Liang的博客 457

JAVA23种设计模式之抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要解决:解决接口选择的问题。 使用时机:产品有多于一个的产品族,而系统只消费其中某一族的产品。 优点

fuu123f的博客 196

2.Java设计模式-----抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory),是23种设计模式之一。抽象工厂模式是这样子定义的: 抽象工厂模式,提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。 在学习抽象工厂模式之前,最好熟悉简单工厂模式以及工厂方法模式,这样对理解抽象工厂模式会有一定帮助,而且抽象工厂模式是基于工厂方法模式而来的。如果你还没有了解到什么是简单工厂模式以及工厂方法模式...

扛麻袋的少年的博客 1455
上一篇: 什么是设计模式,设计模式的分类和原则
下一篇: 设计模式之建造者模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值