Abstract Factory模式也叫抽象工厂模式,是由GoF提出的23种设计模式中的一种。它是对象创建型模式之一,通过抽象工厂为客户(调用者)生成多类产品,抽象工厂负责管理子工厂对象,子工厂负责生成某一类具体的产品对象。
本文介绍设计模式中的抽象工厂(Abstract Factory)模式的概念,用法,以及实际应用中怎么样使用Factory Method模式进行开发。
Abstract Factory模式的概念
在大规模的系统开发过程中,考虑系统的灵活性,低耦合性,可扩展性等因素,常常不直接使用new来生成类的实例,而是通过一个叫做工厂(Factory)的类来专门生成类的实例。
我们在
设计模式之Factory Method - 工厂方法模式
一文中讨论了Factory Method模式,这里再讨论一下一种更高层次的工厂模式:Abstract Factory模式。
Factory Method模式的主要特点是通过工厂提供的方法生成类的对象,而具体的对象的生成工作被委让给(延迟到)子工厂,所以被称为工厂方法模式。
Abstract Factory模式与Factory Method很相似,都是通过工厂的方法生成目标类的对象,但它们之间的也存在一些区别。
Abstract Factory模式与Factory Method模式的主要区别:
- Factory Method采用的是工厂类继承机制(生成子工厂类,重载该工厂方法,在重载的方法中生成目标对象)。而Abstract
Factory强调的是对象组合机制,由在父工厂内定义不同的“子工厂”对象来负责不同的目标对象的创建。再深入一点理解:
-
Factory Method模式中,产品(目标对象)的使用者可能需要使用具体的子工厂来生成该产品;Abstract
Factory模式则采用传参数的形式直接在父工厂内决定该产品对象应该由哪一个子工厂生产。也就是说,Abstract
Factory模式中,跟客户打交道的只有抽象工厂与抽象产品,客户不需要知道产品由哪个工厂生产,也不需要知道被生产的是哪一种具体的产品。
- Factory Method模式中,省城的对象产品只限定于某一类产品;Abstract Factory模式则可以提供多个生产接口生成多类产品
- Abstract Factory模式Factory Method模式的更高层次的抽象,也更最具一般性。可以把Factory Method模式看作是Abstract Factory模式的一种特殊情况
简单一点说,Abstract Factory模式通过抽象工厂为客户(调用者)生成多类产品,抽象工厂负责管理子工厂对象,子工厂负责生成某一类具体的产品对象。
Abstract Factory模式的应用场景:
- 存在多类产品,并需要对这些产品区别对待处理:需要分别为这些产品定义2个以上的接口或抽象类
- 客户端只需要与最上层的工厂(抽象工厂),与最上层的抽象产品打交道
Abstract Factory用到以下几个概念:
- 抽象工厂类(1个):定义创建不同类实例的多个接口;创建与管理子工厂对象,提供统一方法以取得不同的子工厂对象
- 子工厂类(多个):生成具体的类的实例
- 抽象产品类(多个):对产品的抽象
- 具有继承关系的具体的产品类(多个):继承自抽象产品类,它们之间一般存在或多或少的依耐关系
工厂与产品的关系可以用UML类图表示:
下面举例说明。
Abstract Factory模式的实现范例
有一类Bus(公交车)系列产品Bus,ModelBus;
与另一类Truck(卡车)系列产品Truck,ModelTruck;
其中Bus与Truck可以由同一个工厂BusTruckFactory生产;ModelBus与ModelTruck可以由同一个工厂ModelFactory生产。
BusTruckFactory工厂与ModelFactory工厂由总工厂CarFactory统一管理。
我们(客户)直接从CarFactory工厂定购Bus系列产品,与Truck(卡车)系列产品。
下面我们用Abstract Factory模式实现上面的过程
CarFactory:定义生产Bus和Truck的接口规范;管理BusTruckFactory与ModelFactory工厂。
BusTruckFactory:生产Bus和Truck的非模型车。
ModelFactory:生产Bus和Truck的模型车。
AbstractBus:公交车(包括模型与非模型车)父类
Bus:公交车。继承自AbstractBus类。
ModelBus:公交车模型。继承自AbstractBus类。
AbstractTruck:卡车(包括模型与非模型车)父类
Truck:卡车。继承自AbstractTruck类。
ModelTruck:卡车模型。继承自AbstractTruck类。
工厂类定义:
总工厂CarFactory.java
<script src="http://www.lifevv.com/images/code/js/shCore.js" type="text/javascript"></script><script>
<!--//
function _syboos_pmplat_setUpCode() {
//dp.SyntaxHighlighter.ClipboardSwf = 'js/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('_syboos_pmplat_code');
}
window.onload=_syboos_pmplat_setUpCode;
//-->
</script><script src="http://www.lifevv.com/images/code/js/shBrushJava.js" type="text/javascript"></script>
-
public
abstract
class
CarFactory {
-
public
static
final
int
BUS_TRUCK =
1
;
-
public
static
final
int
BUS_TRUCK_MODEL =
2
;
-
-
-
-
public
abstract
AbstractBus createBus();
-
-
public
abstract
AbstractTruck createTruck();
-
-
-
public
static
CarFactory getCarFactory(
int
carType) {
-
switch
(carType) {
-
case
BUS_TRUCK:
-
return
new
BusTruckFactory();
-
case
BUS_TRUCK_MODEL:
-
return
new
ModelFactory();
-
default
:
-
return
null
;
-
}
-
}
-
}
public abstract class CarFactory {
public static final int BUS_TRUCK = 1; //参数定义。生产非模型车。
public static final int BUS_TRUCK_MODEL = 2; //参数定义。生产模型车。
//定义生产公交车的接口
public abstract AbstractBus createBus();
//定义生产卡车的接口
public abstract AbstractTruck createTruck();
//管理子工厂类,根据参数调用不同的子工厂进行生产
public static CarFactory getCarFactory(int carType) {
switch (carType) {
case BUS_TRUCK:
return new BusTruckFactory();
case BUS_TRUCK_MODEL:
return new ModelFactory();
default:
return null;
}
}
}
生产非模型车的工厂BusTruckFactory.java
-
public
class
BusTruckFactory
extends
CarFactory {
-
-
public
AbstractBus createBus() {
-
return
new
Bus();
-
}
-
-
public
AbstractTruck createTruck() {
-
return
new
Truck();
-
}
-
}
public class BusTruckFactory extends CarFactory {
//生产公交车(非模型)
public AbstractBus createBus() {
return new Bus();
}
//生产卡车(非模型)
public AbstractTruck createTruck() {
return new Truck();
}
}
生产模型车的工厂ModelFactory.java
-
public
class
ModelFactory
extends
CarFactory {
-
-
public
AbstractBus createBus() {
-
return
new
ModelBus();
-
}
-
-
public
AbstractTruck createTruck() {
-
return
new
ModelTruck();
-
}
-
}
public class ModelFactory extends CarFactory {
//生产公交车模型
public AbstractBus createBus() {
return new ModelBus();
}
//生产卡车模型
public AbstractTruck createTruck() {
return new ModelTruck();
}
}
产品类定义:
Bus系列产品:
-
public
class
AbstractBus {
-
public
String getType() {
-
return
"Abstract Bus"
;
-
}
-
}
-
-
-
public
class
Bus
extends
AbstractBus {
-
public
String getType() {
-
return
"Bus"
;
-
}
-
}
-
-
public
class
ModelBus
extends
AbstractBus {
-
public
String getType() {
-
return
"ModelBus"
;
-
}
-
}
public class AbstractBus {
public String getType() {
return "Abstract Bus";
}
}
public class Bus extends AbstractBus {
public String getType() {
return "Bus";
}
}
public class ModelBus extends AbstractBus {
public String getType() {
return "ModelBus";
}
}
Truck系列产品:
-
public
class
AbstractTruck {
-
public
String getType() {
-
return
"Abstract Truck"
;
-
}
-
}
-
-
-
public
class
Truck
extends
AbstractTruck {
-
public
String getType() {
-
return
"Truck"
;
-
}
-
}
-
-
public
class
ModelTruck
extends
AbstractTruck {
-
public
String getType() {
-
return
"ModelTruck"
;
-
}
-
}
public class AbstractTruck {
public String getType() {
return "Abstract Truck";
}
}
public class Truck extends AbstractTruck {
public String getType() {
return "Truck";
}
}
public class ModelTruck extends AbstractTruck {
public String getType() {
return "ModelTruck";
}
}
Client调用:
-
public
class
Client {
-
public
static
void
main(String[] args) {
-
-
CarFactory factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK);
-
-
Bus bus = factory.createBus();
-
System.out.println("生产了:"
+ bus.getType());
-
-
Truck truck = factory.createTruck();
-
System.out.println("生产了:"
+ truck.getType());
-
-
-
factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK_MODEL);
-
-
bus = factory.createBus();
-
System.out.println("生产了:"
+ bus.getType());
-
-
truck = factory.createTruck();
-
System.out.println("生产了:"
+ truck.getType());
-
}
-
}
public class Client {
public static void main(String[] args) {
//取得工厂对象
CarFactory factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK);
//生产公交车
Bus bus = factory.createBus();
System.out.println("生产了:" + bus.getType());
//生产卡车
Truck truck = factory.createTruck();
System.out.println("生产了:" + truck.getType());
//取得工厂对象
factory = CarFactory.getCarFactory(CarFactory.BUS_TRUCK_MODEL);
//生产公交车
bus = factory.createBus();
System.out.println("生产了:" + bus.getType());
//生产卡车
truck = factory.createTruck();
System.out.println("生产了:" + truck.getType());
}
}
执行Client,输出结果:
C:\AbstractFactory>javac *.java
C:\AbstractFactory>java Client
生产了:Bus
生产了:Truck
生产了:ModelBus
生产了:ModelTruck
C:\FactoryMethod>
小结
本文比较详细地介绍了Abstract Factory模式的概念,并应用具体的范例让我们更进一步地加深了对Abstract Factory模式的了解。
Abstract Factory模式的应用范围很广,近期我们会使用Abstract Factory模式实现支持多数据库的DAO体系结构
分享到:
相关推荐
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
NULL 博文链接:https://zhouhaitao.iteye.com/blog/1003684
设计模式举例 抽象工厂模式 代码+用例图 设计模式, 设计模式举例-抽象工厂模式(有图有真相)
设计模式C++学习之抽象工厂模式(AbstractFactory)
C++设计模式课件9_Abstract Factory_抽象工厂.pdf
博客 走进设计模式之抽象工厂(Abstract Factory) 对应代码
Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来...
设计模式,AbstractFactory,抽象工厂模式
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)
设计模式抽象工厂模式(AbstractFactory)源代码
要好好去读上面那个实例,虽然有点绕嘴,其实只要用心去读,分清了抽象工厂模式的各个角色,对理解设计模式是非常重要的。理解头绪,然后接合简单工厂模式、工厂方法模式对工厂家族的了解,再加上抽象工厂模式的意图...
在前一节,我们介绍了Strategy模式,并使用此模式实现了一个根据角色的职业来分配技能的范例(实际也就是动态地为类分配方法)。...本文将讨论如何使用GOF的Abstract Factory抽象工厂来实现这样的角色外形设计。
C#设计模式之抽象工厂(abstract factory)模式示例源代码
C#面向对象设计模式纵横谈Abstract Factory 抽象工厂模式(创建型模式)
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) (Level 300)
今天,我要为大家介绍的是Java中的抽象工厂模式,这是一种非常实用的设计模式,让我们一起来探索它的魅力吧! 内容概要 本文将从以下几个方面详细介绍Java抽象工厂模式: 抽象工厂模式的应用场景。 抽象工厂模式...
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式),.net常用设计模式。
- 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合...
抽象工厂模式可以实现不同数据库之间的无缝移植。 该项目是在三层架构的基础上改进的。希望对初学者有帮助。