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 Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。...抽象工厂模式java demo用于学习
抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型...
本次代码只提供了创建型模式的应用代码和说明,包括:Singleton 单件,Abstract Factory 抽象工厂,Builder 生成器,Factory Method 工厂方法。 Singleton模式解决的是实体对象个数的问题。除了Singleton...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) 2 结构型模式---这些设计模式关注类和...
目前最有影响力的书籍是:《设计模式:可复用面向对象软件的基础》,它共编录了23种设计模式,分三大类别:创建型模式、结构型模式、行为模式,其中有一种创建型模式是抽象工厂设计模式。 在学习抽象工厂设计模式...
创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singleton(单例) 结构型 6. Adapter Class/Object(适配器) 7. Bridge(桥接) ...
简单工厂模式, 工厂方法模式,抽象工厂模式,建造者模式,原型模式,单例模式的PPT和实例源代码,适合模式小白学习和给小白讲课当做教材使用
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:...
3.1 ABSTRACT FACTORY(抽象工厂)——对象创建型模式 3.2 BUILDER(生成器)——对象创建型模式 3.3 FACTORY METHOD(工厂方法)——对象创建型模式 3.4 PROTOTYPE(原型)——对象创建型模式 3.5 SINGLETON(单件...
六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法...
创建型模式 工厂模式 抽象工厂模式 生成器模式 原型模式 单例模式 结构型模式 适配器模式 桥接模式 组合模式 装饰器模式 代理模式 ...... 行为型模式 观察者模式 …… JVM JVM体系 类加载机制/过程 双亲委派机制/...
3.1 Abstract Factory(抽象工厂)—对象创建型模式 57 3.2 Builder(生成器)—对象创建型模式 633.3 Factory Method(工厂方法)—对象创建型模式 70 3.4 Prototype(原型)—对象创建型模式 87 3.5 Singleton...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...
抽象工厂模式( Abstract Factory ) 单例模式( Singleton ) 建造者模式( Builder ) 原型模式( Prototype ) 结构型模式包含了: 适配器模式( Adapter ) 装饰器模式( Decorator ) 代理模式( Proxy ) ...