要创建一个对象,可以使用new关键字,但是这样的初始化方式常常导致耦合的问题,如何避免这样的问题呢?我们来重点研究一下工厂方法模式和抽象工厂模式。
工厂方法模式
工厂方法模式定义了一个创建对象的接口,让这个接口的实现来决定具体要实例化的类,工厂方法使得
类把实例化延迟到了子类。要做到这个我们就要为每一种要被生产的具体产品创建一个工厂。来看看java中SOAPConnection创建的例子。要发送SOAP request,要先创建SOAPConnection,代码如下:
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); SOAPConnection soapConnection = soapConnectionFactory.createConnection(); soapConnection.call(...);
可以看出客户端在创建SOAPConnection的时候,只知道一个可以创建SOAPConnection的工厂,但并不知道这个工厂是如何将SOAPConnection生产出来的。实际上SOAPConnectionFactory.newInstance()拿到的是一个HttpSOAPConnectionFactory(具体工厂),最后由这个具体的工厂创建HttpSOAPConnection这个具体的产品。
SOAPConnectionFactory中的createConnection()方法就是一个工厂方法,对具体产品的创建被“延迟”到了HttpSOAPConnectionFactory中。可以看出工厂方法将创建对象的过程被很好的封装了起来,当你需要创建一个新的具体产品的时候,只需要新增具体产品的类和一个对应的创建该产品的工厂类即可,客户端可以通过反射机制拿到具体工厂,再由工厂来创建对象,这是符合开闭原则的。
抽象工厂
抽象工厂简单的说是为了创建产品族而生的。什么是产品族呢?可以理解为一组相关联的位于不同产品等级结构的产品组成的家族。举个例子,一个生产车轮的工厂,每一个车轮都包含了生产轮毂,外胎,内胎,所以轮毂、外胎、内胎可以说是一组相关联的产品,什么叫做不同产品等级结构呢?小汽车的车轮、公共汽车的车轮、卡车的车轮都是不同的,所以它们需要生产的轮毂、内胎、外胎也不同,小汽车、公共汽车、卡车的等级结构是不同的。现在我们要开始组装车轮了,抽象工厂的结构到底是怎么样的呢?
可以看到制造轮胎需要的具体产品是由CarWheelMaterialFactory和BussWheelMaterialFactory两个具体工厂来生产的,这两个具体工厂分别创造出来一个产品族。如果这个生产轮子的车间要转型不满足于生产轿车和公共汽车的轮子,而是生产卡车轮子,会发生什么?只需要新增卡车内胎,卡车外胎,卡车轮毂三个具体产品,再增加一个卡车轮子材料工厂即可。因为抽象工厂可以创造一个完整的产品系列,所以只需要扩展具体工厂和具体产品,再切换一下客户端使用的具体的工厂即可。
抽象工厂也有很显而易见的缺点,就是需要增加产品时,需要修改到几乎所有的类,比如我们制造轮胎时,除了内胎,外胎,轮毂,汽车厂商要求一起制造安装轮子到汽车上时需要用到的配套螺栓,BusWheel有BusWheel的螺栓,CarWheel有CarWheel的螺栓。这时我们的抽象工厂需要增加一个创造螺栓的方法,所有的具体工厂也都需要修改用以满足生产新的产品,这一点在使用抽象工厂时要特别注意。
总结一下:
工厂方法模式:有一个抽象产品类,派生出多个具体产品类。另外有一个抽象工厂类,派生出多个具体工厂类,创建具体产品的逻辑被封装在了具体工厂内部。
抽象工厂模式: 有多个有关系的抽象产品,派生出多个具体产品。具体工厂封装了创建产品族的逻辑, 让新增系列产品变得非常容易。
两者区别:工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建一个产品族,这个产品族包含了一系列有内在联系的具体产品。
相关推荐
抽象工厂模式可以保证在任何环境下都能正确地创建对象,提高了代码的可移植性,但其缺点是增加新平台时,需要增加新的抽象工厂和一系列具体工厂,这可能会导致系统结构变得复杂。 对比这三种工厂模式: 1. **简单...
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码
- `factory2`、`factory3`、`factory1` 这些文件名可能是实现工厂模式的Java源代码,分别代表了不同级别的工厂类,如简单工厂、工厂方法和抽象工厂的实现。通过查看这些源代码,可以学习到如何在实际项目中应用这些...
今天我们将深入探讨三种主要的设计模式:简单工厂、工厂方法和抽象工厂。 ### 简单工厂模式 简单工厂模式是一种创建型设计模式,它提供了一个静态方法来创建对象,而无需暴露创建逻辑。这个静态方法根据输入参数来...
工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...
工厂模式分为三种主要形态:简单工厂模式、工厂方法模式和抽象工厂模式。 1. 简单工厂模式:也称为静态工厂方法模式,它通过一个静态方法来创建对象。在这个例子中,`FruitGardener` 类就是简单工厂,它根据输入的...
在软件设计模式中,工厂方法模式和抽象工厂模式是两种常用的创建型模式,它们都用于对象的创建,但各有特点和适用场景。首先,我们来理解这两种模式的基本概念。 **简单工厂模式**: 简单工厂模式是一种较为初级的...
工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
本主题聚焦于C++中的三个工厂模式:简单工厂、工厂方法和抽象工厂。这些模式都围绕着对象的创建过程,旨在提高代码的灵活性、可读性和可维护性。 1. **简单工厂模式**: - 简单工厂模式是一种静态工厂方法,它提供...
工厂模式是C++软件开发中非常实用的设计模式之一,通过合理运用简单工厂、工厂方法和抽象工厂,可以有效地提升软件的结构清晰度、可维护性和扩展性。理解并掌握这些模式对于构建高质量、可扩展的软件系统至关重要。...
在软件设计模式中,工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)是两种常用的创建型设计模式,它们都属于“工厂”家族,但有着不同的应用场景和目标。 工厂方法模式的核心...
在软件设计模式中,"简单工厂"和"抽象工厂"是两种常见的创建型设计模式,它们主要用于对象的创建。这两种模式都是为了将对象的创建过程封装起来,使得客户端代码无需关心具体的实现细节,只需调用工厂提供的接口即可...
设计模式是软件工程中的一...简单工厂模式适合初学者入门,而工厂方法和抽象工厂模式则更适用于大型项目,以提高代码的灵活性和可维护性。理解并合理运用这些设计模式,能够帮助开发者构建更加稳定、可扩展的软件系统。
工厂方法、简单工厂和抽象工厂是创建型设计模式的三种不同形式,它们都关注于对象的创建过程,但各有其特点和适用场景。 1. **工厂方法(Factory Method)**: 工厂方法模式定义了一个创建对象的接口,但让子类...
在Java等面向对象编程语言中,工厂模式分为简单工厂、工厂方法和抽象工厂三种类型。标题中的“抽象工厂”是工厂模式的一种高级形式,它关注于创建一系列相关的或相互依赖的对象家族,而不仅仅是一个单独的对象。抽象...
在软件设计模式中,"抽象工厂"、"工厂方法"和"简单工厂"都是创建型设计模式,它们都用于封装对象的创建过程,提供了一种间接的途径来创建对象,从而使得代码更加灵活,易于扩展。下面将详细介绍这三个工厂模式。 ##...
工厂方法与抽象工厂设计模式,这份文档介绍了这种设计模式
工厂方法(Factory Method)和抽象工厂方法(Abstract Factory Method)是两种常见的设计模式,尤其在Java编程中被广泛应用。这个"工厂方法应用实例源码"展示了如何在实际项目中使用这两种设计模式来实现一个馅饼店...