0

0

java 三种工厂模式的快速,简易理解

高洛峰

高洛峰

发布时间:2016-12-15 14:31:45

|

1275人浏览过

|

来源于php中文网

原创

java 3种工厂模式的快速,简易理解
1.简单工厂模式(simple factory)
就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。它定义一个用于创建对象的接口,由子类决定实例化哪一个类。

  //定义水果 接口 public interface Fruit { void plantFruit(); void eatFruit(); } //苹果实现水果接口 public class Apple implements Fruit { @Override public void plantFruit() { System.out.println("种苹果。"); } @Override public void eatFruit() { System.out.println("吃苹果。"); } } //橘子实现水果接口 public class Orange implements Fruit { @Override public void plantFruit() { System.out.println("种橘子。"); } @Override public void eatFruit() { System.out.println("吃橘子。"); } } //水果工厂 public class FruitFactory { public static Fruit getFurit(String fruitName) { //简单工厂模式 if (fruitName.equalsIgnoreCase("Apple")) { // 如果是苹果,则返回苹果实例 return new Apple(); } else if (fruitName.equalsIgnoreCase("Orange")) { // 如果是橘子,则返回橘子实例 return new Orange(); } else { return null; } } } //测试类 public class Test { public static void main(String[]args){ //调用简单工厂模式 FruitFactory.getFurit("Orange").plantFruit(); } } 输出:种橘子。


总结
A:我要购买苹果,只需向工厂角色(FruitFactory)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。
B:但是对于工厂角色(FruitFactory )来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。
C:因此这种简单工厂模式的开放性比较差。




=============================================================

2.工厂方法模式(Factory Method)
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。

  //定义水果 接口 public interface Fruit { void plantFruit(); void eatFruit(); } //苹果实现水果接口 public class Apple implements Fruit { @Override public void plantFruit() { System.out.println("种苹果。"); } @Override public void eatFruit() { System.out.println("吃苹果。"); } } //橘子实现水果接口 public class Orange implements Fruit { @Override public void plantFruit() { System.out.println("种橘子。"); } @Override public void eatFruit() { System.out.println("吃橘子。"); } } //水果工厂([b]注意:此工厂声明为一个接口,具有了良好的扩展性[/b]) public interface FactoryMethod { /** * 工厂方法 */ Fruit getFruit(); //定义获取水果这一过程 } //苹果对水果工厂的实现 public class getApple implements FactoryMethod{ @Override public Fruit getFruit() { // TODO Auto-generated method stub return new Apple(); } } //橘子对水果工厂的实现 public class getOrange implements FactoryMethod { @Override public Fruit getFruit() { // TODO Auto-generated method stub return new Orange(); } } //测试类 public class TestFactoryMethod { public static void main(String[] args) { getApple apple = new getApple(); apple.getFruit().eatFruit(); } } 输出:吃苹果。



总结:
A:工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。
B:工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于反正只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。
C:如果需要加入一个新的水果,那么只需要加入一个新的水果类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的水果类而言,这个系统完全支持"开-闭"原则。
D:对Factory Method模式而言,它只是针对一种类别(如本例中的水果类Fruit),但如果我们还想买肉,那就不行了,这是就必须要Abstract Factory模式帮忙了。


=============================================================

3.抽象工厂模式(Abstract Factory)
抽象工厂模式可以说是简单工厂模式的扩展,它们主要的区别在于需要创建对象的复杂程度上。 
在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族。 在只有一个产品族的情况下,抽象工厂模
式实际上退化到工厂方法模式。 

立即学习Java免费学习笔记(深入)”;

IJPay聚合支付SDK
IJPay聚合支付SDK

IJPay聚合支付SDK让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。不依赖任何第三方mvc框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。

下载

  //定义水果 接口 public interface Fruit { void plantFruit(); void eatFruit(); } //苹果实现水果接口 public class Apple implements Fruit { @Override public void plantFruit() { System.out.println("种苹果。"); } @Override public void eatFruit() { System.out.println("吃苹果。"); } } //橘子实现水果接口 public class Orange implements Fruit { @Override public void plantFruit() { System.out.println("种橘子。"); } @Override public void eatFruit() { System.out.println("吃橘子。"); } } //定义 肉 的接口 public interface Meat { void buyMeat(); void eatMeat(); } //猪肉实现接口 public class BigMeat implements Meat { @Override public void buyMeat() { System.out.println("买猪肉。"); } @Override public void eatMeat() { System.out.println("吃猪肉。"); } } //牛肉实现接口 public class CowMeat implements Meat{ @Override public void buyMeat() { System.out.println("买牛肉。"); } @Override public void eatMeat() { System.out.println("吃牛肉。"); } } //定义消费者的接口 public interface UserFactory { /** * 水果工厂方法 */ public Fruit getFruit(Fruit whichFruit); /** * 肉的工厂方法 */ public Meat getMeat(Meat whichMeat); } //实现消费者的接口 public class User implements UserFactory { @Override public Fruit getFruit(Fruit whichFruit) { return whichFruit; } @Override public Meat getMeat(Meat whichMeat) { return whichMeat; } } //测试类 public class TestUserFactory { public static void main(String[]args){ Fruit apple=new Apple(); Meat bigMeat=new BigMeat(); //消费者实例 User me=new User(); me.getFruit(apple).eatFruit(); me.getMeat(bigMeat).buyMeat(); } } 输出: 吃苹果。 买猪肉。



总结:
A:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。
B:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
C:抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品(Fruit)等级结构;而抽象工厂模式则需要面对多个产品等级结构(Fruit、Meat)。

更多java 三种工厂模式的快速,简易理解相关文章请关注PHP中文网!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

Apipost从入门到精通
Apipost从入门到精通

共31课时 | 2.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号