JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

设计模式初次介绍-工厂模式、抽象工厂模式 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 阅读详情

上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口。而深克隆则是将对象通过序列化和反序列化 的方式进行创建和还原。

本小结将学习的是工厂模式,这个模式在平时是特别常用的,还需好好理解。我也将举一些例子🌰给大家
image.png、

从生活出发

假设我们今天不想做饭,想出去吃饭、肯定选定一家好吃的川菜馆,然后我们找好位置坐下,给厨师说,我想吃糖醋排骨。 稍微等待几分钟、菜就可以做好,然后给你呈上来。

这是一个很经典的例子,我们平时也经常有这样的实际问题,你发现了么?

  • 我只需要告诉厨师菜名,我要吃啥就行了
  • 我不关注这个菜是怎么生产的 new()

开始撸代码

/**
 * 抽象产品 菜
 */
public interface FoodProduct {
    void show();
}
------------
/**
 * 具体产品
 */
public class HongShao implements FoodProduct {
    @Override
    public void show() {
        System.out.println("红烧排骨");
    }
}
------------
public class TangCu implements FoodProduct {
    @Override
    public void show() {
        System.out.println("糖醋鱼");
    }
}

创建厨房工厂

创建一个厨房类,厨房可以用来生产食物产品,我们只需要告诉厨房,这里是通过id 编号的形式告诉厨房的。我们只需要告诉厨房所需要的食物 而不关心这个食物产品是如何创建出来的。

public class KitchenFactory {
    /**
     * id=1 上菜红烧肉 id=2 糖醋鱼
     * @param id
     */
    public FoodProduct cooking(int id) {
        if (1 == id) {
            return new HongShao();
        } else {
            return new TangCu();
        }
    }
}
KitchenFactory kitchen = new KitchenFactory();
FoodProduct food = kitchen.cooking(1);
food.show();
--------
红烧排骨

理解工厂模式

通过这个简单的例子,我们可以学习到:

  • 无需关注对象是如何创建的。只需通过指定的关键字 就能拿到我需要的产品,这就是简单工厂模式。

抽象工厂

image.png

http://c.biancheng.net/view/1351.html

抽象工厂,就是简单工厂的抽象版、如何理解呢?我们上面的工厂(厨房)它已经是一个确定的对象 了。而抽象工厂,则是在厨房 的基础上,再次衍生出一个接口,我们的厨房 则是这个抽象类的一个具体实例化。

代码源于生活

我又要开始举栗子🌰了。请细细品

我们都知道小米 小米既可以生产手机 也可以生产电器用品 那么这就是一个很好的例子。

小米抽象工厂 是一个巨大的工厂,它里面有小米手机工厂 以及小米电器工厂 而不同的工厂,则生产不同的产品。

代码教学开始

首先,我们得需要一个抽象工厂,这个工厂可以包含手机工厂和电器工厂。

public interface AbstractFactory {
    /**
     * 创建手机工厂
     * @return
     */
    PhoneFactory phoneFactory();
    /**
     * 创建电器工厂
     * @return
     */
    ElectricalFactory electricalFactory();
}

当然,手机工厂不知道是具体哪个工厂,反正它可以做一些事情,比如创建手机。

public interface PhoneFactory {
    /**
     * 手机工厂可以做的事情
     */
    void show();
}
-----------
public interface ElectricalFactory {
    /**
     * 电器工厂可以生产电器
     */
    void show();
}

上手实际创建一个小米工厂

public class XiaoMiFactory implements AbstractFactory {
    
    @Override
    public PhoneFactory phoneFactory() {
        return new XiaoMiPhoneFactory();
    }
    @Override
    public ElectricalFactory electricalFactory() {
        return new XiaoMiElectricalFactory();
    }
}
-------------
public class XiaoMiElectricalFactory implements ElectricalFactory {
    @Override
    public void show() {
        System.out.println("小米电器工厂可以生产电器。。比如小米扫地机器人");
    }
}
-------------
public class XiaoMiPhoneFactory implements PhoneFactory {
    @Override
    public void show() {
        System.out.println("小米手机工厂可以生产小米手机。。。");
    }
}

当然,小米工厂实现抽象工厂,那小米工厂就必须要包含两个子工厂,手机工厂和电器工厂了。我们也可以创建一个华为工厂,其实是一样的道理。

AbstractFactory factory = new XiaoMiFactory();

PhoneFactory phoneFactory = factory.phoneFactory();
phoneFactory.show();
--------
小米手机工厂可以生产小米手机。。。

我们从创建的小米工厂中拿出小米手机工厂 然后再执行手机工厂可以做事情,抽象工厂,就是在上面的简单工厂的层次上进行了再次的抽象,将具体的工厂进行抽象。

假设我们按照上面的逻辑。对于一个工厂,我想要一部手机 我给工厂说一声就行了。我不关心这个手机 是如何生产出来的。我该怎么操作?

我稍微将之前的几个接口作为稍微的改造。

public interface PhoneFactory {
    /**
     * 手机工厂可以做的事情
     */
    PhoneProduct show();
}
---------------
public class XiaoMiPhoneFactory implements PhoneFactory {
    @Override
    public PhoneProduct show() {
        return new PhoneProduct(1, "小米10 Pro");
    }
}
----------
//手机对象
public class PhoneProduct {

    private int id;

    private String name;
}

我们可以创建这样一个访问器,通过访问器对象,将我们需要的对象名称传入就好比下单 它能自动匹配工厂,并且调用工厂创建产品 的方法,将我们需要的产品进行创建。

public class AbstractFactoryClient {

    public PhoneProduct createPhone(String name) {

        AbstractFactory factory = null;

        if ("xiaomi" == name) {
            factory = new XiaoMiFactory();
        } else {
            factory = new HuaweiFactory();
        }
        PhoneFactory phoneFactory = factory.phoneFactory();
        
        return phoneFactory.show();
    }
}

测试一下

AbstractFactoryClient factoryClient = new AbstractFactoryClient();
PhoneProduct product = factoryClient.createPhone("xiaomi");
System.out.println(product);
-----------
手机铭牌 编号:1,型号:小米10 Pro

小结

学习完本节,是否对于工厂模式和抽象工厂有了一个深入的了解呢?工厂模式其实在平时的代码中,还是比较常用的。所以还是需要更加努力学习和使用!

代码示例

https://gitee.com/mrc1999/Dev-Examples

参考

http://c.biancheng.net/view/1351.html

欢迎关注

banner

7.设计模式--抽象工厂模式(AbstractFactory模式) 1.定义  抽象工厂模式也是一种创建型模型,是对工厂的一种抽象,可以理解为生产工厂的工厂。不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品。  例如手机和电脑都是通过工厂进行生产的,同时手机和电脑可能属于不同的工厂,但可能是同一个品牌;小米手机和小米电脑属于同一品牌,而华为手机和电脑也属于同一品牌,但是却存在两个维度。    1,产品维度,无论小米手机还是华为 阅读详情

相关推荐

设计模式-创建型模式

目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。应用场景:GUI工具包中,为不同的操作系统提供统一的界面元素创建机制。描述:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。核心思想:通过定义一个抽象层来创建一系列产品,而不是单一的产品。客户端代码使用的是由抽象工厂提供的接口,而不直接依赖于具体的产品类。优点:易于交换“系列产品”,因为具体工厂类在运行时被实例化;为大规模的产品设计提供了开放式的兼容性。// 抽象产品A// 具体产品A1。

java_green_hand0909的博客 1161

【java_设计模式】简单工厂、工厂方法、抽象工厂

学习路径:https://coding.imooc.com/class/270.html 【简单工厂】不属于设计模式,是一种【编码风格】 【工厂方法】、【抽象工厂】属于【创建型】的设计模式 // 基础简单工厂 FruitFactory fruitFactory = new FruitFactory(); // 约定一个标识让工厂去生成,这里可以用反射的方式演进得更合理 Fruit fruit ...

chenghan_yang的博客 473

Java创建型设计模式-抽象工厂模式

我们将针对此图进行编程,着重介绍抽象工厂模式。总的来说,‌抽象工厂模式适用于需要创建一组相关产品,‌同时具备高度灵活性和可维护性的场景。‌抽象工厂模式是一种设计模式,‌它属于创建型模式,‌主要用于构建产品族。‌这种模式当有多个抽象角色时使用,‌向客户端提供一个接口,‌使得客户端在不必指定产品的具体情况下,‌能够创建多个产品族中的产品对象。‌抽象工厂模式是所有工厂模式中最抽象和最具一般性的一种形态,‌它针对的是多个产品族结构,‌而不是单个产品系列结构。‌。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1945

Java编程语言-Task5学习笔记

Task5学习笔记——面向对象核心技术练习1练习2 今天学完Task5,对抽象类与接口有了一定了解,对于它们的区别: 1.抽象类可以有构造方法,接口中不能有构造方法。 2.抽象类中可以有普通成员变量,接口中不能有普通成员变量。 3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。 4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。 5. 抽象

weixin_43984037的博客 830

设计模式 - 抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这种模式特别适用于需要创建一系列相关产品的情况,而且这些产品的具体实现可能会随着环境的不同而改变。本文将详细介绍抽象工厂模式的概念,并通过具体的Java代码示例来说明如何实现这一模式。

菜鸟小码的博客 2311

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1085

02 【创建型】抽象工厂模式 理解与使用

抽象工厂 大白话:一个最大的抽象工厂,它里面不仅有生产手机的工厂,也有生产家用电器的工厂,工厂里面套工厂,这就是抽象工厂,通过工厂生产出需要的工厂,再有生产出的工厂建造 生产不一样的产品 开个玩笑,我怎么可能做PHP呢 JAVA是世界上最好的语言,没有之一 就按照这个例子,有一家抽象工厂,它可以有生产手机和生产电器的工厂,它的工厂有具体的实现类(小米...

Marc1999的博客 310

从时序精度到视觉盛宴:PY32F030驱动WS2812的工程艺术与避坑指南

本文深入探讨了基于PY32F030微控制器驱动WS2812智能LED的完整解决方案。通过精确的时序控制、硬件PWM结合DMA传输技术,实现了稳定可靠的驱动效果,并提供了电源管理、信号完整性和常见问题排查等实用避坑指南,帮助开发者轻松应对严格的纳秒级时序挑战。

wind6的博客 120

Java创建型设计模式之简单工厂,工厂方法,抽象工厂

在Java的23中设计模式中,其中有创建型的一类创建模式,通常用来抽象封装创建对象来使用的,这一类创建模式是使得客户端调用者不用关心对象是如何创建,统统交给一个叫做“工厂”的对象来创建对应的对象。这样就能做到客户端不与想要创建的对象紧密地耦合,降低耦合度。 1.简单工厂 简单工厂具体来并不属于Java中的23种设计模式中之一,它只是一种对创建对象的简单的封装,只需要传入一个正确的参数,就...

我神级欧文的博客 547

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

交换机基本介绍(分类、性能指标、硬件构成及工作方式)

一、交换机的分类与性能指标 1.1交换机的分类 按照网络构成方式来分的话,交换机分为三类:接入层交换机、汇聚层交换机和核心层交换机。 按照OSI模型来划分的话,分为:二层交换机、三层交换机和四层交换机 还有一种按照硬件形态来划分,可以分成两类:盒式交换机和机框式交换机。 盒式交换机是一种有固定端口数,有时也会带有少量扩展槽的交换机。机架式交换机是一种插槽式的交换机,这种交换机扩展性较好,可支持不同的网络类型,可支持更大端口密度的网络。一般在数据中心的接入层都会采用盒式交换机,盒式...

monologuezjp的博客 4万+

2022-15-Java 设计模式-抽象工厂模式

在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供多个产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。 在介绍抽象工厂模式前,我们先厘清两个概念: 产品等级结构:产品等级结构指的是产品的继承结构,例如一个空调抽象类,它有海尔空调、格力空调、美的空调等一系列的子类,那么这个空调抽象类和他的子类就构成了一个产品等级结构。 产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如,海尔工厂生产海尔空调、海尔冰

zzhangwa的博客 3631

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5661

简单工厂模式、工厂模式与抽象工厂模式详解

设计模式是一套被反复使用、多数人认可的、经过分类编目的、代码设计经验的总结。它们为软件设计提供了一定的指导和最佳实践。特别是在创建对象时,简单工厂、工厂模式和抽象工厂模式这三种创建型模式经常被提及和应用。简单工厂模式是一种创建型设计模式,它通过一个单一的工厂类来负责创建一系列相关的对象。这个工厂类根据传入的参数来决定实例化哪一个具体类的实例。客户端在使用时不需要知道具体的类名,只需要提供必要的信息给工厂。工厂模式属于创建型模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离。

2302_77758423的博客 3878

Waymo数据集里的隐藏彩蛋:5个激光雷达数据融合实战(附Python代码)

本文深入解析Waymo数据集中5个激光雷达的数据融合技术,提供Python实战代码,帮助开发者掌握多传感器协同工作的关键方法。通过时间同步、坐标转换和运动补偿等技术,实现高精度3D场景重建,提升自动驾驶系统的环境感知能力。

weixin_30399821的博客 79

基于mengzi-t5训练生成式模型

【代码】基于mengzi-t5训练生成式模型。

开卷有益 170

【Java设计模式 - 创建型模式3】抽象工厂模式

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

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

N32G430学习笔记11- systick使用函数-延时函数

N32学习笔记11- systick使用函数-延时回调函数-延时函数

Car12 1416

设计模式--六种创建型模式

前言   每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。 创建型模式的基本理解 创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。 一个类创建型模式使用继承改变被实例

冯浩月 9638

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java工厂模式详解:方法工厂模式与抽象工厂模式

方法工厂模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。抽象工厂模式(Abstract Factory Pattern)提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。方法工厂模式和抽象工厂模式都是用于创建对象的设计模式,但它们的应用场景和侧重点不同。方法工厂模式侧重于单个对象的创建,通过子类决定实例化哪个类;

2401_83447580的博客 1911

WINCC7.3破解文件

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

Java设计模式-工厂模式

Java设计模式-工厂模式 什么是工厂模式? 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 简单编写一个类: 1、简单工厂模式 interface IFruit{ public void eat(); //吃水果 } class Apple implements IFruit{ public voi

Java厂长 1万+

创建型设计模式优缺点总结及场景应用Java

设计模式描述优点缺点单例模式确保对象的唯一性1. 单例对象在内存中只有一个,可以减少内存开支,不过在java中要注意垃圾回收机制的影响。2. 单例模式提供了对唯一示例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。3. 允许可变数目实例。1. 单例模式中没有抽象层,因此扩展困难,若要扩展,除非修改代码,基本上没有第二种途径。2.面向对象语言垃圾回收机制,当对象长时间不使用,被销毁回收,导致实例需要重新创建,且单例状态丢失简单工厂模式。

SheepYangStudy的博客 2096

设计模式之实验二: 创建型设计模式实验

实验项目二: 创建型设计模式实验 (1)实验目的与原理 ①结合实例,熟练绘制创建型设计模式结构图。 ②结合实例,熟练使用Java面向对象编程语言实现创建型设计模式。 ③通过编程实践,理解每一种创建型设计模式的概念和内涵、结构、优缺点以及应用场景。 (2)实验内容与步骤 ①使用简单工厂模式设计一个可以创建不同几何形状( Shape)(例如圆形( Circle).、矩形 Rectangle)和三角形( ( Triangle)等的绘图工具类,每个几何图形均具有绘制方法daw()和擦除方法 erase(),要求在绘

夏曦 8887

JAVA设计模式之3种工厂模式

转自http://www.kongzid.com/archives/design1,创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。 创建型...

孔子说 4190

设计模式5——抽象工厂模式

是一种创建型模式。1、提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。2、和工厂方法模式不同的是,有多种类型的对象(产品)需要被实例化,同时工厂也被定义了多个不同产品创建的接口。

weixin_43687024的博客 2887

[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式

(1)抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了在抽象工厂中声明的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。(3)增加新的产品族很方便,无须修改已有系统,符合开闭原则。

程序员三木的博客 1583
上一篇: JAVA设计模式 2【创建型】原型模式的理解与使用、理解浅克隆和深克隆
下一篇: JAVA设计模式 4【创建型】理解建造者模式
Marc1999
博客等级 码龄9年 7粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值