Java常用设计模式--三种工厂模式之抽象工厂模式(Abstract Factory Pattern)
时间:2022-07-23
本文章向大家介绍Java常用设计模式--三种工厂模式之抽象工厂模式(Abstract Factory Pattern),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
抽象工厂方法模式角色:
- 抽象工厂(AbstractFactory)角色 :是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- 具体工厂类(ConreteFactory)角色 :这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建某一种产品对象。
- 抽象产品(Abstract Product)角色 :工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品(Concrete Product)角色 :抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。在抽象工厂中创建的产品属于同一产品族,这不同于工厂模式中的工厂只创建单一产品,。
抽象工厂模式与工厂方法模式的区别?
抽象工厂是生产创建一组相关或者相互依赖的产品对象,这些产品对象必须相互是有关系或有依赖的,而工厂方法中的工厂是生产单一产品对象的工厂。
学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。
所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族
抽象工厂模式所提供的一系列产品就组成一个产品族;
而工厂方法提供的一系列产品称为一个等级结构。
拿手机的例子来说明他们之间的区别:比如华为P30的运行内存、机身内存、电池容量组成一个产品族和小米10的运行内存、机身内存、电池容量产品族,而这两个产品族都来自三个产品等级:运行内存、机身内存、电池容量
package com.example.abstractfactory;
public interface IHuawei {
void show();
}
package com.example.abstractfactory;
public interface IXiaomi {
void show();
}
package com.example.abstractfactory;
public class HuaWeiP30 implements IHuawei {
@Override
public void show() {
System.out.println("我是华为p30");
}
}
package com.example.abstractfactory;
public class XiaoMi10 implements IXiaomi {
@Override
public void show() {
System.out.println("我是小米10");
}
}
package com.example.abstractfactory;
public interface IFactory {
IHuawei createHuaWei();
IXiaomi createXiaoMi();
}
package com.example.abstractfactory;
public class Factory implements IFactory{
@Override
public IHuawei createHuaWei() {
return new HuaWeiP30();
}
@Override
public IXiaomi createXiaoMi() {
return new XiaoMi10();
}
}
package com.example.abstractfactory;
public class Test {
public static void main(String[] args) {
IFactory factory = new Factory();
factory.createHuaWei().show();
factory.createXiaoMi().show();
}
}
抽象工厂模式的优点
- 分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
- 使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从huawei系列到xiaomi系列只需要切换一下具体工厂。
抽象工厂模式的缺点
- 不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python中pandas库中DataFrame对行和列的操作使用方法示例
- PHP实现简易计算器功能
- DataFrame 数据合并实现(merge,join,concat)
- PHP ajax+jQuery 实现批量删除功能实例代码小结
- python对execl 处理操作代码
- Python手动或自动协程操作方法解析
- 什么是python的自省
- python Socket网络编程实现C/S模式和P2P
- keras 多任务多loss实例
- 什么是python的必选参数
- python进程与线程小结实例分析
- PHP集成环境XAMPP的安装与配置
- Python socket服务常用操作代码实例
- Python select及selectors模块概念用法详解
- keras使用Sequence类调用大规模数据集进行训练的实现