package com.yitiao.demo.factoryMethod;
/**
-
@Author: 一条IT
-
@Date: 2021/6/8 23:00
*/
public class Ship implements Transport {
@Override
public void deliver() {
System.out.println(“Ship”);
}
}
package com.yitiao.demo.factoryMethod;
/**
-
@Author: 一条IT
-
@Date: 2021/6/8 23:00
*/
public class Truck implements Transport {
@Override
public void deliver() {
System.out.println(“Truck”);
}
}
基础创建者
package com.yitiao.demo.factoryMethod;
/**
-
@Author: 一条IT
-
@Date: 2021/6/8 23:07
*/
public abstract class Logistics {
public abstract Transport createTransprot();
}
具体创建者
package com.yitiao.demo.factoryMethod;
/**
-
@Author: 一条IT
-
@Date: 2021/6/8 23:13
*/
public class RoadLogistics extends Logistics{
@Override
public Transport createTransprot() {
return new Ship();
}
}
package com.yitiao.demo.factoryMethod;
/**
-
@Author: 一条IT
-
@Date: 2021/6/8 23:14
*/
public class SeaLogistics extends Logistics {
@Override
public Transport createTransprot() {
return new Truck();
}
}
客户端
package com.yitiao.demo.factoryMethod;
/**
-
@Author: 一条IT
-
@Date: 2021/6/8 23:15
*/
public class Test {
public static void main(String[] args) {
Logistics roadLogistics = new RoadLogistics();
roadLogistics.createTransprot().deliver();
Logistics seaLogistics = new SeaLogistics();
seaLogistics.createTransprot().deliver();
}
}
复杂度: 0.3
流行度: 1
使用示例: 工厂方法模式在 Java 代码中得到了广泛使用。 当你需要在代码中提供高层次的灵活性时, 该模式会非常实用。
核心 Java 程序库中有该模式的应用:
-
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)
(根据协议返回不同的单例对象)
识别方法: 工厂方法可通过构建方法来识别, 它会创建具体类的对象, 但以抽象类型或接口的形式返回这些对象。
无法预知对象确切类别及其依赖关系时
工厂方法将创建产品的代码与实际使用产品的代码分离, 从而能在不影响其他代码的情况下扩展产品创建部分代码。
例如, 如果需要向应用中添加一种新产品, 你只需要开发新的创建者子类, 然后重写其工厂方法即可。
希望用户能扩展你软件库或框架的内部组件
继承可能是扩展软件库或框架默认行为的最简单方法。 但是当你使用子类替代标准组件时, 框架如何辨识出该子类?
解决方案是将各框架中构造组件的代码集中到单个工厂方法中, 并在继承该组件之外允许任何人对该方法进行重写。
让我们看看具体是如何实现的。 假设你使用开源 UI 框架编写自己的应用。 你希望在应用中使用圆形按钮, 但是原框架仅支持矩形按钮。 你可以使用 圆形按钮
RoundButton子类来继承标准的 按钮
Button类。 但是, 你需要告诉 UI框架
UIFramework类使用新的子类按钮代替默认按钮。
为了实现这个功能, 你可以根据基础框架类开发子类 圆形按钮 UI
UIWithRoundButtons , 并且重写其 createButton
创建按钮方法。 基类中的该方法返回 按钮
对象, 而你开发的子类返回 圆形按钮
对象。 现在, 你就可以使用 圆形按钮 UI
类代替 UI框架
类。 就是这么简单!
希望复用现有对象来节省系统资源
在处理大型资源密集型对象 (比如数据库连接、 文件系统和网络资源) 时, 你会经常碰到这种资源需求。
让我们思考复用现有对象的方法:
-
首先, 你需要创建存储空间来存放所有已经创建的对象。
-
当他人请求一个对象时, 程序将在对象池中搜索可用对象。
-
…然后将其返回给客户端代码。
-
如果没有可用对象, 程序则创建一个新对象 (并将其添加到对象池中)。
这些代码可不少! 而且它们必须位于同一处, 这样才能确保重复代码不会污染程序。
可能最显而易见, 也是最方便的方式, 就是将这些代码放置在我们试图重用的对象类的构造函数中。 但是从定义上来讲, 构造函数始终返回的是新对象, 其无法返回现有实例。
因此, 你需要有一个既能够创建新对象, 又可以重用现有对象的普通方法。 这听上去和工厂方法非常相像。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
[外链图片转存中…(img-JY3aDXhk-1711092919260)]
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
[外链图片转存中…(img-Bqd2Mgf0-1711092919261)]
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
[外链图片转存中…(img-mC6Qxilc-1711092919261)]
[外链图片转存中…(img-fE6yLZB7-1711092919262)]