【设计模式】简单工厂模式和工厂方法模式
简单工厂模式
顾名思义,此模式的设计结构是简单的,核心是生产对象。
一般来说,运用工厂模式生产的对象应该是构建对象的过程比较复杂的,获取构建对象的过程在日后可能发生变更的。
简单工厂模式,在工厂类中直接生产对象,即工厂类中直接依赖对象类。
代码见:
https://github.com/nicchagil/design-pattern-exercise-with-java/tree/master/简单工厂模式
工厂方法模式
使用简单工厂模式,
假如有一天,Factory生产的Dog对象要全部切换为Wolf(狼),那么我们在Factory的产生方法中修改逻辑即可。(此假设场景是全部哦,既然要将产生Dog变更为产生Wolf,那么修改代码逻辑无可厚非)
假如有一天,某些客户端原来使用Cat对象的地方,需要使用Dog对象,这需要在客户端修改代码。(这也不是用工厂方法模式能解决的)
最后,假如有一天,需要添加生产一个Duck(鸭),那么难道要修改Factory?如果我们的生产方法写出如下,那么修改的代码量会更多,而且改起来容易错。

public static Animal getInstance(String type) { if (type == null || type.trim().length() == 0) { return null; } if (type.equals("dog")) { return new Dog(); } else if (type.equals("cat")) { return new Cat(); } return null; }
那么,如果,我们使用工厂方法模式,只需要增加几个类,就可完成增加Duck的类型。
实体类如“简单工厂模式”,省略。

package No002工厂方式模式; import No002工厂方式模式.model.Animal; public interface IFactory { public Animal getInstance(); }

package No002工厂方式模式; import No002工厂方式模式.model.Animal; import No002工厂方式模式.model.Dog; public class DogFactory implements IFactory { public Animal getInstance() { return new Dog(); } }

package No002工厂方式模式; import No002工厂方式模式.model.Animal; import No002工厂方式模式.model.Cat; public class CatFactory implements IFactory { public Animal getInstance() { return new Cat(); } }

package No002工厂方式模式; public class Call { public static void main(String[] args) { IFactory f = new DogFactory(); System.out.println(f.getInstance()); IFactory ff = new CatFactory(); System.out.println(ff.getInstance()); } }
其类图是这样的:
JDK不乏工厂方法模式的例子,我们熟悉的ArrayList、LinkedList的iterator()就是其一,看看如下类图就知:
Iterable:
Iterator:
简单看下ArrayList.Itr的一个方法的实现:
@SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; }
作者:Nick Huang 博客:http://www.cnblogs.com/nick-huang/
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,点赞或评论哦;如果您喜欢我的文章,请点击关注我哦~
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
如果本文对您有用,点赞或评论哦;如果您喜欢我的文章,请点击关注我哦~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
2016-05-13 【Java】Map杂谈,hashcode()、equals()、HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap