1、抽象工厂模式的意图;
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、抽象工厂模式的适用性;
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
3、场景描述;
考虑一个生产多种不同风格的家具的工厂(FurnitureFactory),不同风格的家具系列可以提供不同的门、窗、地板等的组合,为同一所住房可以提供不同的外观和行为。
4、抽象工厂模式类图;
角色:
- AbstractFactory:提供给用户类Client使用工厂创建对象的接口;
- Client:用户类;
- ConcreteFactory1、ConcreteFactory2:AbstractFactory类的具体实现类,包含了创建具体对象的方法;封装了不同的具体产品作为一个系列(如ProductA1、ProductB1、ProductC1);
- ProductA1、ProductA2:一般具有相同的父类ProductA,但是ProductA1、ProductA2提供了不同的展现形式;
5、代码实现;
5.1 工程结构图;
5.1.2实例类图;
实例类图中的类基本对应设计模式的一般化类图。
其中FurnitureFactory是接口,ExpensiveDoor是Door的子类,ExpensiveFloor是Floor的子类,ExpensiveWindow是Window的子类。
5.2实践;
5.2.1 基本组件类;
Window.java
package com.crazysnail.furnitures; public class Window { public Window(){ System.out.println("I'm a ordinary window"); } }
Floor.java
package com.crazysnail.furnitures; public class Floor { public Floor(){ System.out.println("I'm a ordinary floor."); } }
Door.java
package com.crazysnail.furnitures; public class Door { public Door(){ System.out.println("I'm a ordinary door."); } }
ExpensiveWindow.java
package com.crazysnail.furnitures; public class ExpensiveWindow extends Window { public ExpensiveWindow(){ System.out.println("I'm a expensive window."); } }
ExpensiveFloor.java
package com.crazysnail.furnitures; public class ExpensiveFloor extends Floor { public ExpensiveFloor(){ System.out.println("I'm a expensive floor"); } }
ExpensiveDoor.java
package com.crazysnail.furnitures; public class ExpensiveDoor extends Door{ public ExpensiveDoor(){ System.out.println("I'm a expensive door."); } }
5.2.2工厂类;
FurnitureFactory.java
package com.crazysnail.abstractfactory; //抽象工厂模式中对外开放的接口,接口中定义了抽象工厂能够生产的产品种类 public interface FurnitureFactory{ public Window createWindow(); public Floor createFloor(); public Door createDoor(); }
OrdinaryFurnitureFactory.java
package com.crazysnail.abstractfactory; //普通家具的工厂类,组合了普通的Window、Floor、Door类作为一个系列来使用 public class OrdinaryFurnitureFactory implements FurnitureFactory { @Override public Window createWindow() { return new Window(); } @Override public Floor createFloor() { return new Floor(); } @Override public Door createDoor() { return new Door(); } }
ExpensiveFurnitureFactory.java
package com.crazysnail.abstractfactory; //昂贵家具工厂类,组合了昂贵的ExpensiveWindow、ExpensiveFloor、ExpensiveDoor类,作为一个系列来使用 public class ExpensiveFurnitureFactory implements FurnitureFactory { @Override public Window createWindow() { return new ExpensiveWindow(); } @Override public Floor createFloor() { return new ExpensiveFloor(); } @Override public Door createDoor() { return new ExpensiveDoor(); } }
5.2.3 使用抽象工厂举例;
DecoretionCompany.java
package com.crazysnail.abstractfactory; /** * * * 易于交换产品系列 * 有利于控制产品的一致性,控制使用相同系列的门、窗、地板 * 提供给用户的都是一些系列化的产品 * * But,难以支持新种类的产品; * * 提供给用户的接口仅仅是不同的家具工厂,但是用户并不知晓具体的类 * */ public class DecorationCompany { public void decorateHouse(FurnitureFactory factory, House house){ Window window = factory.createWindow(); Door door = factory.createDoor(); Floor floor = factory.createFloor(); /*装饰*/ house.addWindow(window); house.addDoor(door); house.addFloor(floor); } }
6、总结;
6.1 抽象工厂的优点;
- 分离了具体的类——提供给用户类的接口仅仅是抽象工厂类及其子类,隐藏了组件类的具体实现。
- 使得易于交换产品系列——在用户类中使用时,可以很方便的替换产品的系列,如只要DecorationCompany类中的decorateHouse方法中factory参数,便可以替换整个样式。
- 有利于产品的一致性——将一组不同的组件组成一个系列来使用,如例子中的将Window、Door、Floor封装到OrdinaryFurnitureFactory中作为一个系列使用,将ExpensiveWindow、ExpensiveDoor、ExpensiveFloor封装到ExpensiveFurnitureFactory中来作为一个系列来使用。
6.2 抽象工厂的缺点;
- 难以支持新种类的产品——若要能够生产新的产品,则需要同时修改抽象工厂类及其子类。
相关推荐
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...
在众多设计模式中,“抽象工厂”(Abstract Factory)模式是一种创建型模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不必指定它们的具体类。这一模式深受哲学的影响,特别是“形而上学”的概念,探讨了...
抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这个模式使代码能够独立于实际的产品实现,增强了代码的可扩展性和灵活性。 ### **1. 模式概念** 抽象...
抽象工厂模式是软件设计模式中的一种创建型模式,它的主要思想是提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。在实际应用中,它常用于跨平台开发,或者当系统需要根据不同的条件创建...
**抽象工厂模式**是设计模式中的结构型模式之一,它提供了一种创建对象族的方式,这些对象属于同一族,它们相互之间存在特定的关系和依赖。抽象工厂模式的主要目的是隔离产品对象的创建和使用,使得更换产品族或者...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的关键在于,它允许客户端代码在不关心具体实现的情况下,能够创建一系列相关的对象,同时保持了良好的封装...
抽象工厂模式是软件设计模式中的一种,属于创建型模式,它提供了一种创建对象族的接口,而无需指定具体的类。这种模式的关键在于抽象工厂,它定义了一组创建对象的接口,这些对象属于同一族(或者属于某一特定上下文...
工厂模式是一种常用的软件设计模式,它是创建型设计模式的一种,主要解决对象的创建问题,将对象的创建过程封装起来,使得创建过程独立于使用过程。这样可以提高代码的可复用性和灵活性,同时降低了系统的耦合度。...
在软件设计模式中,"简单工厂"和"抽象工厂"是两种常见的创建型设计模式,它们主要用于对象的创建。这两种模式都是为了将对象的创建过程封装起来,使得客户端代码无需关心具体的实现细节,只需调用工厂提供的接口即可...
抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在"抽象工厂实例(mySchool实例)"中,我们将深入探讨如何运用这个模式...
抽象工厂设计模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。在酒店管理系统中,这个模式可能被用来创建与不同数据库系统(如Sqlserver2005)交互的对象,...
抽象工厂模式是软件工程中常用的一种创建型设计模式,它的核心思想是为创建一组相关或相互依赖的对象提供一个接口,而不需要指定它们具体的类。在Java中,抽象工厂模式被广泛应用,它有助于整合代码,提高系统的可...
抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象组族的方法,而无需指定其具体的类。在本案例中,我们将探讨如何在实际的软件开发中,特别是在三层架构(表现层、业务逻辑层、数据访问层)中应用...
抽象工厂模式是设计模式中的一种,属于创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式的关键在于“抽象”,它允许我们创建一系列相关的对象,而不必关心它们的具体实现。在Java或其他...
抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。在C#中,抽象工厂模式通常用于当系统需要一组相关或相互依赖的对象时,这些对象的类可能未知或者在不同的平台、...
抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而不必指定它们的具体类。在三层架构中,尤其是在业务逻辑层和数据访问层之间,抽象工厂可以用来创建数据库连接或者数据...
在Java编程中,工厂模式是一种非常重要的设计模式,它属于创建型模式,主要用于对象的创建。本文将深入探讨Java中的工厂模式,包括基本的工厂模式、抽象工厂模式以及工厂方法模式。 **工厂模式**:工厂模式的核心...
抽象工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,当一个产品族中的所有对象被创建时,通常会使用同一个工厂类。这个模式的关键在于,它允许客户端代码与具体的产品实现解耦,...
抽象工厂模式是一种重要的软件设计模式,它属于创建型模式,主要解决的是当系统需要创建一系列相关或相互依赖的对象时,而这些对象的类在运行时可能不确定的问题。在这个模式中,我们通过一个抽象工厂接口来定义创建...
抽象工厂(Abstract Factory)模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式允许客户端在不关心具体实现的情况下,使用一组相关或相互依赖的对象。在Java或...