博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抽象工厂方法模式
阅读量:4182 次
发布时间:2019-05-26

本文共 2096 字,大约阅读时间需要 6 分钟。

定义

抽象工厂模式(Abstract Factory Pattern),又称工具箱模式(Kit/Toolkit):为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类,封装了变化,隔离了变化,让客户端代码变得稳定。

类图及角色

在这里插入图片描述

抽象工厂:抽象工厂方法的核心,接口或者抽象类。与系统的商业逻辑无关。
具体工厂:同类图上注释。
抽象产品:抽象工厂方法模式所创建的对象的父类,或者它们共同拥有的接口。
具体产品:客户端需要的东西,抽象工厂模式所创建的任何产品对象都是某具体产品的实例。

使用
  1. 系统不依赖于产品类的细节。
  2. 系统只消费产品族中的一族产品。
  3. 所有的产品族以相同的接口出现。
优点
  1. 产品从客户端代码中分离出来。
  2. 容易改变产品的系列。
  3. 将一个系列的产品族统一到一起创建。
缺点

在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。

产品等级和产品族

产品等级:即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

工厂模式和抽象工厂模式的区别

用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对象。抽象工厂模式是工厂方法模式的升级版,它用来创建一组相关或者相互依赖的对象。
  它与工厂方法模式的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品等级结构,表现为一个接口或抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类,如上图中的ProductA和ProductB。

//抽象工厂,返回产品的类型(A和B是两种关联产品(鸡腿和可乐))public interface AbstractFactory {
/** * 创建产品A * @return */ public AbstractProductA createProductA(); /** * 创建产品B * @return */ public AbstractProductB createProductB();}//公共的产品接口,可以理解为抽象的鸡腿public interface AbstractProductA {
}//公共的产品接口,可以理解为抽象的可乐public interface AbstractProductB {
}//具体工厂,生产鸡腿和可乐的套餐(德克士)public class ConcreteFactory1 implements AbstractFactory {
@Override public AbstractProductA createProductA() {
// TODO Auto-generated method stub return new ProductA1(); } @Override public AbstractProductB createProductB() {
// TODO Auto-generated method stub return new ProductB1(); }}//具体工厂,生产鸡腿和可乐的套餐(肯德基)public class ConcreteFactory2 implements AbstractFactory {
@Override public AbstractProductA createProductA() {
return new ProductA2(); } @Override public AbstractProductB createProductB() {
return new ProductB2(); }}//分别生产的工厂,这里理解为德克士的鸡腿public class ProductA1 implements AbstractProductA {
}//分别生产的工厂,这里理解为肯德基的鸡腿public class ProductA2 implements AbstractProductA {
}//分别生产的工厂,这里理解为德克士的可乐public class ProductB1 implements AbstractProductB {
}//分别生产的工厂,这里理解为肯德基的可乐public class ProductB2 implements AbstractProductB {
}

上一篇:

下一篇:

转载地址:http://rlrai.baihongyu.com/

你可能感兴趣的文章
Redis常见面试题
查看>>
JDK重要包和Java学习方法论
查看>>
网络通讯中的三次握手与四次挥手原理详解
查看>>
IDEA公司真牛逼,发行最适合程序员编程字体~
查看>>
闲鱼 12 块买的软件资源!禁止贩卖赚钱
查看>>
GitHub 开源神器:图片秒变文件
查看>>
公司能不能监控到微信聊天?
查看>>
Pandas函数速查手册(高清版)PDF
查看>>
再见了,Teamviewer!
查看>>
Linux下的编译器
查看>>
为什么调试的时候需要编译选项中添加 -g
查看>>
Linux中的readelf命令
查看>>
Linux下的小程序--进度条
查看>>
c语言和c++的区别及缺省参数的使用
查看>>
c++函数重载及其实现原理
查看>>
c语言的传值和传址
查看>>
c++之引用
查看>>
c++之命名空间
查看>>
进程间通信(1)--基本概念
查看>>
c++中的类与对象
查看>>