设计模式(五)抽象工厂(创建型)
抽象工厂(abstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类。
适用场合:
1.一个系统要独立于它的产品的创建、组合和表示时。
2.一个系统要由多个产品系列中的一个来配置时。
3.当你强调一系列相关的产品对象的设计以便进行联合使用时。
4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。
类图
代码
抽象工厂abstractFactory的代码:
public interface AbstractFactory { public ProductA factoryA(); public ProductB factoryB(); }
具体工厂类实现AbstractFactory,用于创建对象。
public class ConcreteFactory1 implements AbstractFactory { @Override public ProductA factoryA() { return new ProductA1(); } @Override public ProductB factoryB() { return new ProductB1(); } }
public class ConcreteFactory2 implements AbstractFactory { @Override public ProductA factoryA() { return new ProductA2(); } @Override public ProductB factoryB() { return new ProductB2(); } }
产品A的抽象接口(同理产品B):
public interface ProductA { public void method1(); public void method2(); }
产品A的具体实现(同理产品B):
public class ProductA1 implements ProductA { @Override public void method1() { System.out.println("ProductA1---->method1"); } @Override public void method2() { System.out.println("ProductA1---->method2"); } }
public class ProductA2 implements ProductA { @Override public void method1() { System.out.println("ProductA2---->method1"); } @Override public void method2() { System.out.println("ProductA2---->method2"); } }
抽象工厂模式的应用代码:
public class Main { public static void main(String[] args) { AbstractFactory abf1 = new ConcreteFactory1(); AbstractFactory abf2 = new ConcreteFactory2(); ProductA a1 = abf1.factoryA(); ProductA a2 = abf2.factoryA(); ProductB b1 = abf1.factoryB(); ProductB b2 = abf2.factoryB(); a1.method1(); a1.method2(); a2.method1(); a2.method2(); b1.method1(); b1.method2(); b2.method1(); b2.method2(); } }
工厂方法与抽象工厂的区别
- 工厂方法模式
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
- 抽象工厂模式
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
- 区别
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
抽象工厂的应用
- 抽象工厂模式的使用场景
抽象工厂模式的使用场景定义非常简单:一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式,什么意思呢?例如一个文本编辑器和一个图片处理器,都是软件实体,但是*nix下的文本编辑器和WINDOWS下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况,也就是具有了共同的约束条件:操作系统类型,于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。
- 抽象工厂模式的注意实现
在抽象工厂模式的缺点中,我们提到抽象工厂模式的产品族扩展比较困难,但是一定要清楚是产品族扩展困难,而不是产品等级,在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可,也就是说横向扩展容易,纵向扩展困难。
- 最佳实践
一个模式在什么情况下才能够使用,是很多读者比较困惑的地方,抽象工厂模式是一个简单的模式,使用的场景非常多,大家在软件产品开发过程中,涉及到不同操作系统的时候,都可以考虑使用抽象工厂模式,例如一个应用,需要在三个不同平台上运行:Windows、Linux、Android上运行,你会怎么设计?分别设计三套不同的应用?非也非也,通过抽象工厂模式屏蔽掉操作系统对应用的影响。三个不同操作系统上的软件功能、应用逻辑、UI都应该是非常类似,唯一不同的是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息。
我是天王盖地虎的分割线
源代码:http://pan.baidu.com/s/1dD1Qx01
java抽象工厂.zip
出处:http://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?