经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Java中常用的设计模式之工厂模式详解
来源:jb51  时间:2022/2/28 8:51:11  对本文有异议

优点

1.一个调用者想创建一个对象,只要知道其名称就可以了。

2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。

3.屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景

1.日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

2.数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。

3.设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

一、实现方式

例如:我们需要在电商平台购买一台手机,我们并不需要去关心手机生产厂商是如何把手机生产出来的,我们只需要在搜索框输入:华为手机,小米手机,就能购买到我们想要的手机了。下面看看具体实现吧。

1、定义一个接口

  1. package com.asurplus.common.factory;
  2. public interface Phone {
  3. /**
  4. * 获取手机
  5. *
  6. * @return
  7. */
  8. String getPhone();
  9. }

2、定义两个接口实现类

  1. package com.asurplus.common.factory;
  2. /**
  3. * 华为手机实现类
  4. */
  5. public class HuaweiPhone implements Phone {
  6. @Override
  7. public String getPhone() {
  8. return "华为手机";
  9. }
  10. }
  1. package com.asurplus.common.factory;
  2. /**
  3. * 小米手机实现类
  4. */
  5. public class XiaomiPhone implements Phone {
  6. @Override
  7. public String getPhone() {
  8. return "小米手机";
  9. }
  10. }

3、定义一个工厂类

  1. package com.asurplus.common.factory;
  2. /**
  3. * 手机工厂类
  4. */
  5. public class PhoneFactory {
  6. /**
  7. * 获取手机
  8. *
  9. * @param name
  10. * @return
  11. */
  12. public static Phone getPhone(String name) {
  13. if ("华为".equals(name)) {
  14. return new HuaweiPhone();
  15. }
  16. if ("小米".equals(name)) {
  17. return new XiaomiPhone();
  18. }
  19. return null;
  20. }
  21. }

二、测试

  1. package com.asurplus.common.factory;
  2. /**
  3. * 工厂模式
  4. */
  5. public class TestMain {
  6. public static void main(String[] args) {
  7. // 获取手机
  8. Phone huaweiPhone = PhoneFactory.getPhone("华为");
  9. System.out.println(huaweiPhone.getPhone());
  10. }
  11. }

输出结果

在这里插入图片描述

我们输入的:华为,得到了华为手机,从而实现了我们的工厂模式。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注w3xue的更多内容!  

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号