设计模式-工厂模式

RK3568平台(USB篇)USB HUB集线器 hub,集线器,连接在host与device之间的一种用于usb接口扩展的usb设备。可以将一个usb上行接口扩展为多个下行接口,使得一个host可以同时与多个device连接。一般来说,一块hub桥接芯片可扩展4个usb接口,而市面上的一拖七hub,其实使用了两块hub桥接芯片,其中一块hub桥接芯片的上行端口连接到另一块hub桥接芯片的下行端口。hub的上行端口面向host,下行端口面向device。在下行端口上,hub提供了设备接入检测和设备移除检测的能力,并给下行端口供电。 阅读详情

概述:


定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。(用工厂方法代替new操作的一种模式)

适用性:


  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式分类:


工厂模式在《Java与模式》中分为三类:

  1. 简单工厂模式(Simple Factory):不利于产生系列产品.
  2. 工厂方法模式(Factory Method):又称为多形性工厂.
  3. 抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品.

这三种模式从上到下逐步抽象,并且更具一般性。
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

简单工厂模式:


简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定哪一个产品类应当被实例化。

先来看看它的组成:

  1. 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
  2. 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
  3. 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

简单工厂模式例子:


以动物为例子实现:动物有很多,如猫,狗,猴子,海豚等动物

抽象产品类:

package com.mode.factory;

/**
 * 动物接口(动物实体类,实现该接口)
 */
public interface IAnimal {

    // == 动物标识 ==
    /**
     * 猫
     */
    public static final int F_CAT = 1;

    /**
     * 狗
     */
    public static final int F_DOG = 2;

    /**
     * 海豚
     */
    public static final int F_DOLPHIN = 3;

    /**
     * 猴子
     */
    public static final int F_MEONKEY = 4;

    /**
     * 动物名
     */
    void name();
}

具体产品类:

/**
 * 猫实体类
 */
public class CatVo implements IAnimal {

    @Override
    public void name() {
        System.out.println("猫");
    }
}

/**
 * 海豚实体类
 */
public class DolphinVo implements IAnimal {

    @Override
    public void name() {
        System.out.println("海豚");
    }
}

// DogVo...MonkeyVo...

工厂类:

/**
 * 简单工厂
 */
public class SimpleFactory {

    /**
     * 创建动物
     * @param id 传入ID标识
     * @return 返回具体对象
     */
    public IAnimal createAnimal(int id) {
        switch (id) {
        case IAnimal.F_CAT:
            return new CatVo();
        case IAnimal.F_DOG:
            return new DogVo();
        case IAnimal.F_DOLPHIN:
            return new DolphinVo();
        case IAnimal.F_MEONKEY:
            return new MonkeyVo();
        }
        return null;
    }
}

调用:

public class MainMethod {

    public static void main(String[] args) {
        simpleFactoryMain();
    }

    public static void simpleFactoryMain() {
        // 初始化简单工厂类
        SimpleFactory sFactory = new SimpleFactory();
        // 创建动物
        IAnimal animal = sFactory.createAnimal(IAnimal.F_DOLPHIN);
        // 获取创建的动物名
        animal.name();
    }
}

工厂方法模式:


工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。

来看下它的组成:

  1. 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
  2. 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
  3. 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
  4. 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品(即暴发户的汽车)产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的!

工厂方法模式例子:


以动物为例子实现:动物有很多,如猫,狗,猴子,海豚等动物

抽象产品角色类:

package com.mode.factory;

/**
 * 动物接口(动物实体类,实现该接口)
 */
public interface IAnimal {

    // 如上

    /**
     * 动物名
     */
    void name();
}

具体产品角色类:

/**
 * 猫实体类
 */
public class CatVo implements IAnimal {

    @Override
    public void name() {
        System.out.println("猫");
    }
}

// DolphinVo...DogVo...MonkeyVo...

抽象工厂类:

/**
 * 动物工厂抽象类
 */
public abstract class AnimalFactory {
    abstract IAnimal create();
}

具体工厂类:

/**
 * 猴子工厂类
 */
public class MonkeyFactory extends AnimalFactory {

    @Override
    public IAnimal create() {
        return new MonkeyVo();
    }

}
//....

调用:

public class MainMethod {

    public static void main(String[] args) {
        factoryMethodMain();
    }

    /**
     * 工厂方法调用
     */
    public static void factoryMethodMain() {
        // 初始化简单工厂类
        AnimalFactory aFactory = new MonkeyFactory();
        // 创建动物
        IAnimal animal = aFactory.create();
        // 获取创建的动物名
        animal.name();
    }
}

可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。

简单工厂和工厂方法模式的比较


工厂方法模式和简单工厂模式在定义上的不同是很明显的。

工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。

反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

抽象工厂模式:


以动物为例子实现:动物有很多,如猫,狗,猴子,海豚等动物

抽象产品角色类:

package com.mode.factory;

/**
 * 动物接口(动物实体类,实现该接口)
 */
public interface IAnimal {

    // 如上

    /**
     * 动物名
     */
    void name();
}

具体产品角色类:

/**
 * 猫实体类
 */
public class CatVo implements IAnimal {

    @Override
    public void name() {
        System.out.println("猫");
    }
}

// DolphinVo...DogVo...MonkeyVo...

抽象工厂类:

/**
 * 动物抽象工厂类
 */
public abstract class AnimalAbstractFactory {
    public abstract CatVo createCat();

    public abstract DogVo createDog();

    public abstract DolphinVo createDolphin();

    public abstract MonkeyVo createMonkey();

}

具体工厂类:

/**
 * 默认工厂(用于创建具体产品)
 */
public class DefaultFactory extends AnimalAbstractFactory {

    @Override
    public CatVo createCat() {
        return new CatVo();
    }

    @Override
    public DogVo createDog() {
        return new DogVo();
    }

    @Override
    public DolphinVo createDolphin() {
        return new DolphinVo();
    }

    @Override
    public MonkeyVo createMonkey() {
        return new MonkeyVo();
    }

}

调用:

public class MainMethod {

    public static void main(String[] args) {
        abstractFactoryMain();
    }

    /**
     * 抽象工厂调用
     */
    public static void abstractFactoryMain() {
        AnimalAbstractFactory aFactory = new DefaultFactory();
        // 创建动物-狗
        DogVo dogVo = aFactory.createDog();
        dogVo.name();
        // 创建动物-猫
        CatVo catVo = aFactory.createCat();
        catVo.name();
    }
}

总结:


  1. 简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。
  2. 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
  3. 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

代码下载


工厂模式FactoryMode - 17KB


参考:
- 工厂模式(百度百科)
- 《Head First 设计模式》 读书笔记04 工厂模式(一)
- 《Head First设计模式》 读书笔记05 工厂模式(二)
- 23种设计模式(3):抽象工厂模式
- 23种设计模式(2):工厂方法模式


FGC_grasp复现 FGC_GraspNet复现 阅读详情

相关推荐

TMC步进电机驱动stealthChop

经过九九八十一难,芯片手册拜读了好多遍,找了好多资料,问了好多人使用TMC2660驱动步进电机终于成功了。最后的问题居然是硬件把管脚画错了,然后我又没有检查,哭。。。

那可真是太开心了的博客 4489

设计模式第3讲——工厂模式(Factory)

工厂模式是一种创建型设计模式。一、什么是工厂模式 二、工厂分类 三、应用场景3.1 生活场景3.2 java场景 四、 工厂模式实现4.0 代码结构4.1 传统模式4.2 简单工厂模式4.3 方法工厂模式4.4 抽象工厂模式五、总结5.1 简单工厂模式5.2 方法工厂模式5.3 抽象工厂

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

TPS65987D USB PD控制器:从原理到实战的完整设计指南

USB PD(Power Delivery)协议是USB Type-C接口实现高功率快充和数据传输的核心技术标准。其工作原理基于CC(Configuration Channel)引脚的双相标记编码(BMC)通信,通过协商电压和电流,实现高达100W的功率传输。这项技术的核心价值在于统一了充电标准,简化了设备间的互操作性,广泛应用于笔记本电脑、移动电源、扩展坞等设备。TPS65987D作为一款高度集成的USB PD控制器,将复杂的协议处理、电源路径管理和多重保护电路集成于单芯片,显著降低了设计复杂度。通过其可

weixin_30983965的博客 338

设计模式 - 工厂模式、建造者模式,就该这样学!

简单工厂不是一种设计模式,反而比较像是一种编程习惯.抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。具体产品 :实现或者继承抽象产品的子类具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。

CYK_byte的博客 3809

Python爬虫实战:高效爬取Vimeo高清视频

在当今数字化时代,视频内容已成为互联网的重要组成部分。Vimeo作为一个高质量的视频分享平台,拥有大量优质视频资源。然而,Vimeo并未提供直接下载视频的选项,因此,我们需要借助Python爬虫技术来获取这些高清视频。(HTTP Live Streaming)格式存储。Vimeo的视频通常不会直接暴露。Vimeo的视频通常以。

2201_76125261的博客 429

Cesium中级开发教程之二十二:视锥体

教程示例网站:https://thomaz529.github.io。

883

23种设计模式——工厂模式

文章目录23种设计模式——工厂模式1、工厂模式概述2、简单工厂模式2.1、简单工厂模式的优缺点2.2、简单工厂模式的结构2.3、简单工厂模式的实现3、工厂方法模式3.1、工厂方法模式的优缺点3.2、工厂方法模式的结构3.3、工厂方法模式的实现4、抽象工厂模式4.1、抽象工厂模式概述4.2、抽象工厂模式结构4.3、抽象工厂模式实现 23种设计模式——工厂模式 1、工厂模式概述 工厂模式的定义:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。这满足创建型模式中所要

万里顾一程的博客 1万+

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

设计模式详解之工厂模式

本文将着眼于工厂模式,从简单工厂模式、工厂方法模式和抽象工厂模式出发,展开学习和深入探讨。

阿里技术 7061

使用Python实现深度学习模型:智能光污染监测与管理

本项目将通过以下几个步骤实现智能光污染监测:收集光污染图像数据数据预处理构建深度学习模型训练模型评估模型部署模型用于实时监测通过本文介绍的步骤,我们实现了一个使用Python和深度学习技术的智能光污染监测与管理系统。该系统能够自动识别光污染源,为相关管理部门提供科学依据,以便更好地规划和管理城市照明。同时,这一方法还可以扩展到其他环境监测领域,为环境保护贡献力量。

Echo_Wish 590

基于生存结局(生存分析/COX回归)的中介效应分析

① 建立观察变量OVB和中介变量MVB的回归模型(注意:这里根据mediation包的介绍,需要构建的是probit模型,而不是logist回归模型,网上有很多的代码用的logistic回归,结果自己跑的时候发现报错,我在这里陷了很久;为了方便演示,我们生成了一个协变量(Age)、一个连续型观察变量(liaOVC)、一个二分类观察变量(OVB)、一个连续型中介变量(MVC)、一个二分类中介变量(MVB)以及最后的结局变量(生存时间[time],生存结局[stats])。

m0_61863309的博客 1万+

Java设计模式——工厂模式

本文对设计模式中工厂模式进行思想和原理的讲解,引用实际例子来方便理解。

weixin_56032340的博客 8632

Kafka 性能优化与常见问题排查

Kafka 的高性能依赖于合理的集群设计、参数优化与高效的监控体系。生产环境中,应重点关注I/O 瓶颈、分区规划、Producer/Consumer 参数调优,并通过监控与排查手段快速定位问题,从而保障 Kafka 在实时场景下的稳定运行。

X2829352498的博客 235

设计模式之工厂模式

工厂模式 1、简单工厂模式 1.1、定义 简单工厂模式(Simple Factory Pattern)是指有一个工厂对象决定创建出哪一种产品类的实例,不属于23种设计模式。 简单工厂是产品的工厂 1.2、应用场景 简单工厂模式适用于工厂类创建的对象较少的场景,且客户端只需要传入工厂参数,对如何创建对象的逻辑不需要关心。 1.3、缺点 工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,违背了开闭原则。 不易于扩展过于复杂的产品结构。 1.4、实例 支付接口规范: public interface

aaa31203的博客 16万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式之【工厂模式】详解

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。

Shine19的博客 1143

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【设计模式】之工厂模式(三种)

今天给大家介绍23种设计模式中的工厂模式,学过Spring的小伙伴应该不陌生,今天给大家详细介绍一下它。🌈

小杰不秃头的博客 2323

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

工厂设计模式

简单工厂模式(静态工厂模式)虽然不符合设计原则,但是使用方便,实际使用最多工厂方法模式不修改已有类的前提下,通过增加新的工厂类实现扩展抽象工厂模式不可以增加产品,但可以增加产品族应用场景JDK中Calendar的getInstance方法JDBC中的Connection对象的获取Spring中IOC容器创建管理的bean方法反射中Class对象的newInstance方法。

学习总结 1484

设计模式——工厂模式

工厂模式 在《Head First 设计模式》一书中,一共介绍了一种类似于工厂模式的编程习惯、两种工厂模式,在这篇文章中,我将对它们分别进行介绍,下面首先来看一下简单工厂。 1、简单工厂 按照惯例,我们应该先介绍一下简单工厂的定义,然后举例说明,这一次,我们不这样做,我们首先举例说明,然后再引出简单工厂的定义,后续两个工厂模式均按此方式进行叙述,从案例中理解模式的定义才能够更加印象深刻。...

记录只为更好地前行 4883

设计模式之工厂模式与抽象工厂模式

工厂模式和抽象工厂模式 在设计模式里面,我们发现了其实工厂模式贺抽象工厂模式是单独分开的两个设计模式,接下来我们去探索一下他们呢得不同之处叭! 工厂模式的分类: 简单工厂模式 用来生产同一等级结构中得任意产品(对于增加新得产品,需要修改已有代码) 工厂方法模式 用来生产同一等级结构中得固定产品(支持增减任意产品) 抽象工厂模式 围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂得工厂 核心本质 实例化对象不使用new,用工厂方法代替 将选择实现类,创建对象同意管理和控制

qq_43325476的博客 2399

《C#设计模式》 工厂三兄弟之 【简单工厂模式】,【工厂方法模式】,【抽象工厂模式】

《C#设计模式》 三种工厂设计模式 【简单工厂模式】 【工厂方法模式】 【抽象工厂模式】 第一种:简单工厂模式 一:【简单工厂模式】 简单工厂模式概念(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简...

TimTiny的博客 2590

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

1.简单工厂设计模式 代码 Video package Factory.简单工厂; public abstract class Video { public abstract void product(); } JavaVideo package Factory.简单工厂; public class JavaVideo extends Video { public voi...

codeDonald的博客 222

【iOS】——工厂设计模式

这种模式旨在为创建对象提供一个统一的接口,隐藏了创建对象的具体逻辑,使得客户端不需要知道所创建对象的具体类,从而降低了对象之间的耦合度,提高了代码的灵活性和可维护性。它为创建对象提供了一种灵活的方式,让子类来决定实例化哪一个类,从而实现了对象创建的延迟化和抽象化,增强了代码的扩展性和可维护性。车没了,该车的引擎和轮胎自然也没了。当系统中加入新产品时,不需要修改抽象工厂和抽象产品提供的接口,也无须修改客户端和其他的具体工厂和具体产品,而只要添加一个具体工厂和与其对应的具体产品就可以了,符合了“开-闭”原则。

m0_73974920的博客 1675
上一篇: 设计模式-访问者模式
下一篇: 设计模式-模板方法模式
「已注销」
博客等级 码龄11年 14粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值