为方便Java技术交流,特地开通免费qq群
点击链接加入群【Java技术交流】:https://jq.qq.com/?_wv=1027&k=53xQNnh 群号214821336
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。我们熟悉的Spring 的 bean 工厂等。
直接上demo.先代码,后介绍。
Shape .java
/**
* 一个接口:关于形状
* Created by Fant.J.
*/
public interface Shape {
/**
* 描述方法
*/
void describe();
}
Circle .java
/**
* Created by Fant.J.
*/
public class Circle implements Shape {
/**
* 描述方法
*/
@Override
public void describe() {
System.out.println("我是个圆形");
}
}
Rectangle .java
/**
* Created by Fant.J.
*/
public class Rectangle implements Shape {
/**
* 描述方法
*/
@Override
public void describe() {
System.out.println("我是一个长方形");
}
}
ShapeFactory .java
/**
* 形状工厂(你可以通过我获取 相应的实例化对象)
* Created by Fant.J.
*/
public class ShapeFactory {
public Shape getShape(String type){
if (type == null){
return null;
}
if ("CIRCLE".equals(type)){
return new Circle();
}else if ("RECTANGLE".equals(type)){
return new Rectangle();
}
return null;
}
}
/**
* Created by Fant.J.
*/
public class Test {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 圆形 实例化对象
Shape circle = shapeFactory.getShape("CIRCLE");
//调用对象方法
circle.describe();
//获取 长方形 实例化对象
Shape rectangle = shapeFactory.getShape("RECTANGLE");
//调用方法
rectangle.describe();
}
}
我是个圆形
我是一个长方形
提问:如果你是一个爱动脑筋的人,你会发现,它和Bean工厂的作用是相似的,但是Bean工厂是这样实现的吗?它会自动去写if语句去创建实例对象吗?
答案肯定是不是的。
当然,我在这里不会像spring 的bean工厂一样,把它的逻辑写出来,因为人家已经是经过很多年的迭代的产品,封装的已经(目不忍视)太厚了,所以我把它的实现原理说明。
可能有些人都想到了,对,就是框架离不开的:反射机制(传送门),不怎么了解的可以很快的看一下我以前的一个文集。
ShapeFactory.java
/**
* 反射
*/
public Object getShape(Class<? extends Shape> clazz){
Object object = null;
try {
object = Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}
Object shape = (Rectangle)shapeFactory.getShape(Rectangle.class);
((Rectangle) shape).describe();
如果我们忘记去对shapeFactory 做强制类型转换的话,那就是一个完全的object对象,使用不方便,那我们如何能够省略类型转换的这一步骤呢?
/**
* 反射 + 泛型
*/
public <T> T getShape(Class<? extends T> clazz){
T object = null;
try {
//实例化,并在这里做 类型转换
object = (T) Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return object;
}
Rectangle shape = shapeFactory.getShape(Rectangle.class);
shape.describe();
我是一个长方形
我们可以看到,事实上也是做了强制类型转换的,只不过在ShapeFactory里做的,我们看不到而已,这种做法会大大方便我们使用。
经过第五点和第六点的学习,我们想想,spring 框架里 其实只有一个工厂,那就是BeanFactory,ApplicationContext 也需要用它来创建对象。那我们如何去写一个针对多个接口实现一个公共的工厂类呢?
/**
* 针对多个接口实现一个公共的工厂类
*/
public <T> Object getObject(Class<T> clazz) {
if (clazz == null ) {
return null;
}
Object obj = null;
try {
obj = Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return obj;
}
留个思考题,我们在Spring 框架下,@Autowired 装配Bean 具体是完成什么样的操作呢,这可能也是工厂模式最好的总结说明。
希望能帮到大家,谢谢大家!
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。
Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。
Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。