三种工厂模式
-
简单工厂模式
用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有的代码)
-
工厂方法模式
用来生产同一等级结构中的固定产品(支持增加任意产品)
-
抽象工厂模式
围绕一个超级工厂创建其他工厂
注:本文主要介绍了 工厂方法模式 !!!
工厂模式的定义
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
特点
“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则
- 被创建的对象称为“产品”;
- 创建产品的对象称为“工厂”;
- 创建与使用相分离;
优点与缺点
- 优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
- 缺点
- 类的个数容易过多,增加复杂度。
- 增加了系统的抽象性和理解难度。
- 抽象产品只能生产一种产品,此弊端可使用
抽象工厂模式
解决。
应用场景
- JDK 中 Calendar 的 getInstance 方法;
- JDBC 中的 Connection 对象的获取;
- Spring IOC 容器创建管理 Bean 对象;
- 反射中 Class 对象的 newInstance 方法;
结构与实现
结构
工厂方法模式的主要角色如下:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
实现
/**
* 工厂模式
*
* @author Strive
*/
public class FactoryPattern {
public static void main(String[] args) {
CatFactory teslaFactory = new TeslaFactory();
teslaFactory.productCar().name();
CatFactory audiFactory = new AudiFactory();
audiFactory.productCar().name();
}
}
/** 汽车抽象工厂 */
interface CatFactory {
/** 生产汽车 */
Cat productCar();
}
/** 特斯拉工厂 */
class TeslaFactory implements CatFactory {
@Override
public Cat productCar() {
return new Tesla();
}
}
/** 奥迪工厂 */
class AudiFactory implements CatFactory {
@Override
public Cat productCar() {
return new Audi();
}
}
/** 产品的抽象类 */
interface Cat {
/** 名称 */
void name();
}
/** 特斯拉 */
class Tesla implements Cat {
@Override
public void name() {
System.out.println("特斯拉 Model3");
}
}
/** 奥迪 */
class Audi implements Cat {
@Override
public void name() {
System.out.println("奥迪 A4L");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78386.html