Java 深入探究讲解工厂方法模式
作者:静静子♡
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品
1. 工厂方法模式介绍
定义:工厂方法模式是对简单工厂模式进一步的抽象化,好处是可以使系统不修改原来代码的情况下引进新的产品,即满足开闭原则。定义一个用于创建对象接口,让子类决定实例化哪一个类,使一个类的实例化延迟到子类中。
2. 工厂方法模式类图UML
3. 工厂方法模式角色说明
抽象工厂(AbstractFactory):提供了创建产品的接口,调用方通过它访问具体工厂的工厂方法来创建产品
具体工厂(ConcreteFactory):实现了抽象工厂定义的方法,完成具体产品的创建
抽象产品(Product):定义了产品的规范,描述产品的主要特征和性能
具体产品(ConcreteProduct):实现了抽象产品的定义的方法,有具体工厂来创建产品,具体工厂和具体产品一一对应
4. 代码实现
工厂方法模式实现:
/** * 抽象工厂:提供具体工厂的共有方法 */ public interface Product { public void show(); } public class ConcreteProduct1 implements Product { @Override public void show() { System.out.println("具体产品1展示..."); } } public class ConcreateProduct2 implements Product { @Override public void show() { System.out.println("具体产品2展示..."); } } /** * 抽象工厂 */ public interface AbstractFactory { public Product createProduct(); } /** * 具体工厂1产生具体产品1 */ public class ConcreteFactory1 implements AbstractFactory { @Override public Product createProduct() { ConcreteProduct1 concreteProduct1 = new ConcreteProduct1(); System.out.println("具体工厂1创建具体产品1..."); return concreteProduct1; } public class ConcreteFactory2 implements AbstractFactory { @Override public Product createProduct() { System.out.println("具体工厂2产生具体产品2..."); return new ConcreateProduct2(); } }
调用方法:
//获取具体产品1 Product product = new ConcreteFactory1().createProduct(); product.show(); Product product1 = new ConcreteFactory2().createProduct(); product1.show();
使用步骤:
- 创建抽象产品类,定义产品的公共方法
- 创建具体产品类(实现抽象产品接口),定义生成的具体产品
- 创建抽象工厂类,定义具体工厂的公共接口
- 创建具体工厂类,定义创建对应具体产品实例的方法
- 调用方调用具体的工厂类的方法,从而创建不同具体产品的实例
5. 工厂模式再探究
解决问题:解决了简单工厂类新增产品需要修改工厂类的方法逻辑问题,即为别开闭原则。
将具体的产品创建退出到工厂类的子类(具体工厂),此时工厂类不再负责所有产品的创建,而是给出具体工厂必须实现的接口,这样工厂方法在添加新的产品的时候,就不需要修改工厂类的逻辑,而是添加了新的工厂子类,符合开闭原则。
6. 优缺点
优点:
- 灵活性强,对于新产品的创建,只需要多写一个对应的工厂类
- 用户只需要指导工厂的名称就可以获得所要的产品,不需要指导产品具体创建过程
缺点:
- 类的个数容易过多,增加了复杂度
- 每一个工厂只能生产一种产品,次弊端可以使用抽象工厂模式解决
7. 应用场景
客户只关注创建产品的工厂名,不需要知道具体的产品名称
到此这篇关于Java 深入探究讲解工厂方法模式的文章就介绍到这了,更多相关Java 工厂方法 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!