网站首页 > 教程分享 正文
一、模式定义
抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。
二、主要作用
允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
三、解决的问题
解决工厂方法模式的缺点:每个工厂只能创建一类产品。
四、模式原理
4.1、UML类图
4.2、模式组成
组成(角色) | 关系 | 作用 |
抽象产品族(AbstractProduct) | 抽象产品的父类 | 描述抽象产品的公共接口 |
抽象产品(Product) | 具体产品的父类 | 描述具体产品的公共接口 |
具体产品(Concrete Product) | 抽象产品的子类;工厂类创建的目标类 | 描述生产的具体产品 |
抽象工厂(Creator) | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(Concrete Creator) | 抽象工厂的子类;被外界调用 | 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例 |
如何理解抽象产品族、抽象产品和具体产品的区别呢?请看下图:
4.3、使用步骤
- 创建抽象工厂类,定义具体工厂的公共接口;
- 创建抽象产品族类 ,定义抽象产品的公共接口;
- 创建抽象产品类 (继承抽象产品族类),定义具体产品的公共接口;
- 创建具体产品类(继承抽象产品类) & 定义生产的具体产品;
- 创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
- 客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例。
五、模式优点
1. 降低耦合
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展。
2. 更符合开-闭原则
新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可。
3. 符合单一职责原则
每个具体工厂类只负责创建对应的产品。
4. 不使用静态工厂方法,可以形成基于继承的等级结构。
六、模式缺点
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开放——封闭”原则。
七、应用场景
- 一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
- 这个系统有多个系列产品,而系统中只消费其中某一系列产品。
- 系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
八、模式示例
8.1、示例背景
背景:假设有两间塑料加工厂(A厂仅生产容器类产品;B厂仅生产模具类产品);随着客户需求的变化,A厂所在地的客户需要也模具类产品,B厂所在地的客户也需要容器类产品;
冲突:没有资源(资金+租位)在当地分别开设多一家注塑分厂
解决方案:在原有的两家塑料厂里增设生产需求的功能,即A厂能生产容器+模具产品;B厂间能生产模具+容器产品。
8.2、抽象工厂类
/**
* @description: 抽象工厂类,定义具体工厂的公共接口
*/
public abstract class Factory {
/**
* 生产容器
*
* @return
*/
public abstract AbstractProduct manufactureContainer();
/**
* 生产模具
*
* @return
*/
public abstract AbstractProduct manufactureMould();
}
8.3、抽象产品族类
/**
* @description: 抽象产品族类 ,定义具体产品的公共接口;
*/
public abstract class AbstractProduct {
/**
* 展示产品
*/
public abstract void show();
}
8.4、抽象产品类
8.4.1、容器产品抽象类
/**
* @description: 抽象产品类--容器 ,定义具体产品的公共接口
*/
public abstract class ContainerProduct extends AbstractProduct {
@Override
public abstract void show();
}
8.4.2、模具产品抽象类
/**
* @description: 抽象产品类--模具 ,定义具体产品的公共接口
*/
public abstract class MouldProduct extends AbstractProduct {
@Override
public abstract void show();
}
8.5、具体产品类
8.5.1、容器产品A类
/**
* @description: 具体产品类--容器A(继承抽象产品类), 定义生产的具体产品
*/
public class ContainerProductA extends ContainerProduct {
@Override
public void show() {
System.out.println("生产出了容器产品A...");
}
}
8.5.2、容器产品B类
/**
* @description: 具体产品类-容器B(继承抽象产品类), 定义生产的具体产品
*/
public class ContainerProductB extends ContainerProduct {
@Override
public void show() {
System.out.println("生产出了容器产品B...");
}
}
8.5.3、模具产品A类
/**
* @description: 具体产品类--模具A(继承抽象产品类), 定义生产的具体产品
*/
public class MouldProductA extends MouldProduct {
@Override
public void show() {
System.out.println("生产出了模具产品A...");
}
}
8.5.4、模具产品B类
/**
* @description: 具体产品类--模具B(继承抽象产品类), 定义生产的具体产品
*/
public class MouldProductB extends MouldProduct {
@Override
public void show() {
System.out.println("生产出了模具产品B...");
}
}
8.6、具体工厂类
8.6.1、A厂 - 生产模具+容器产品
/**
* @description: 具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
* A厂 - 生产模具+容器产品
*/
public class FactoryA extends Factory {
@Override
public AbstractProduct manufactureContainer() {
return new ContainerProductA();
}
@Override
public AbstractProduct manufactureMould() {
return new MouldProductA();
}
}
8.6.2、B厂 - 生产模具+容器产品
/**
* @description: 具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
* B厂 - 生产模具+容器产品
*/
public class FactoryB extends Factory {
@Override
public AbstractProduct manufactureContainer() {
return new ContainerProductB();
}
@Override
public AbstractProduct manufactureMould() {
return new MouldProductB();
}
}
8.7、客户端调用
/**
* @description: 客户端调用
*/
public class Client {
public static void main(String[] args) {
FactoryA mFactoryA = new FactoryA();
FactoryB mFactoryB = new FactoryB();
//A厂当地客户需要容器产品A
mFactoryA.manufactureContainer().show();
//A厂当地客户需要模具产品A
mFactoryA.manufactureMould().show();
//B厂当地客户需要容器产品B
mFactoryB.manufactureContainer().show();
//B厂当地客户需要模具产品B
mFactoryB.manufactureMould().show();
}
}
猜你喜欢
- 2024-10-18 设计模式之 抽象工厂(抽象工厂模式的简单应用)
- 2024-10-18 Aha!设计模式(3)-抽象工厂(2)(抽象工厂模式结构图)
- 2024-10-18 Java经典设计模式-抽象工厂模式(抽象工厂模式在spring的应用)
- 2024-10-18 Java高级编程细节——工厂模式之抽象工厂
- 2024-10-18 java与设计模式-简单工厂-工厂方法-抽象工厂
- 2024-10-18 简单工厂,工厂方法,抽象工厂(简单工厂,工厂方法,抽象工厂区别)
- 2024-10-18 Aha!设计模式(1)-抽象工厂(1)(抽象工厂实例)
- 2024-10-18 抽象工厂模式(Abstract Factory)(抽象工厂模式的意图是)
- 2024-10-18 设计模式记录-抽象工厂模式(抽象工厂模式与工厂方法模式)
- 2024-10-18 你还在new对象吗?用个“抽象工厂模式”生产对象它不香吗
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)