工厂模式是最常用的一类创建型设计模式,包括简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式是最简单的一种
简单工厂模式的定义
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂模式。因此简单工厂模式又被称为静态工厂方法,它属于类创建型模式,但不属于23中设计模式。
简单工厂模式的结构
Factory(工厂角色):工厂角色就是工厂类。负责实现创建所有产品的内部逻辑。工厂类定义了静态的工厂方法。可以被外部直接调用,根据参数的不同返回不同的产品对象。但是产品对象的创建实际是推迟到具体子类的构造方法中。因此,简单工厂模式将对象的创建推迟到不同的子类中,所以是类创建模式。
Product(抽象产品角色):它是工厂类所创建的所有产品的父类,或者抽象。封装了各种产品的共有方法。由于它的出现,保障了工厂角色和子类之间的解耦。工厂角色中只需要定义一个通用的工厂方法。返回类型是Product就可以了。
DifferentProduct(具体产品类):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。
在简单工厂模式中,客户端通过调用工厂类的静态工厂方法来创建不同产品的实例。而无须通过new关键字去创建。其实。通过简单工厂模式去创建对象时,把真正的创建步骤延迟到各个子类的构造方法中。(不一定是构造方法,也可能是getInstance())。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package com.dding.pmsmigrateServer.test; //客户端 public class Test { public static void main(String[] args) { Product product = ProjectFactory.getProduct( "Jeff" ); } } //抽象产品类 abstract class Product{ void dance(){}; } //子产品类 class Jeff extends Product{ void dance(){ System.out.println( "jeff dance" ); } void say(){ } } //子产品类 class Join extends Product{ void dance(){ System.out.println( "join dance" ); } } //工厂类 class ProjectFactory{ public static Product getProduct(String name){ if (name.equals( "Jeff" )){ return new Jeff(); } if (name.equals( "join" )){ return new Join(); } return null ; } } |
静态工厂模式的优点
工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。客户端可以免除直接创建产品对象的职责。而仅仅消费产品。因此简单工厂模式实现了对象创建和使用的分离。
可能我们觉得客户端直接去创建产品也没什么大不了。因为也就是new一下对象。但是我们可以设想。如果子类多且名称复杂。客户端直接去创建子类就显得代码混乱且容易造成错误。因为你可能代码中有十几个类的new。都看不懂new的是什么。但是如果使用简单工厂方法,首先是我们定义了统一的对象获取接口,代码整齐划一,其次,我们去记录简单的参数要比记录复杂的子类名要容易得多。
静态工厂模式的缺点
工厂类中集中了所有产品的创建逻辑。职责很重,一旦工厂类挂壁了。整个系统都得挂壁
系统扩展困难。一旦添加了新的产品就得去更改工厂类中的静态工厂方法。在产品类型较多的时候,有可能造成工厂类中的静态工厂方法逻辑复杂。违背了开闭原则。开闭接口是希望面向接口编程。出现新的产品的时候新增新产品子类就可以了。不应该去改之前的代码。但是在简单工厂模式中,必须要去更改工厂类中的静态工厂方法。
简单工厂模式由于使用的是静态的工厂方法,因此,工厂类就无法形成基于继承的等级结构。
简单工厂模式的典型应用和源码分析 https://blog.csdn.net/wwwdc1012/article/details/82504040
Calendar类获取日历类对象
Calendar抽象类,该类的子类有BuddhistCalenda、JapaneseImperialCalendar、GregorianCalendar、RollingCalendar.Calendar抽象类中提供了一个getInstance方法。根据参数然后通过switch case java8/ if-else java7来创建相应的子类对象。也就是说在calendar中也用了简单工厂模式。只不过Calendar类一个人包揽了抽象产品和工厂类的角色罢了。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 想让你多爱自己一些的开源计时器
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 大模型 Token 究竟是啥:图解大模型Token
· 如何在 .NET 中 使用 ANTLR4
· 用99元买的服务器搭一套CI/CD系统