【设计模式 05】工厂方法模式

工厂方法模式

define an interface or abstract class for creating an object but let the subclasses decide which class to instantiate.

参考:

  1. refactoringguru | factory-method
  2. javatpoint | factory-method-design-pattern
  3. 博客园| 工厂方法

简单工厂的问题

简单工厂把可能很复杂的对象创建过程分装在工厂类内部,客户端只需要给简单工厂一个“类的标志”,工厂类就能动态返回一个实例化对象,这样的好处是简化了客户端操作,从客户端按说,符合开闭原则,但每次添加新的产品,都需要修改工厂类,添加新的判断逻辑,不符合开闭原则。为了解决简单工厂的这个问题,工厂方法中会先定义一个创建对象的接口或抽象类,然后让子类去决定实例化哪个类。

工厂方法的优点

  1. 客户端只需要知道产品对应的接口即可,无需关心产品的具体实现细节。
  2. 比简单工厂有更好的可拓展性,添加新产品只需要实现接口即可。
  3. 耦合度进一步下降。

适用场景

  1. 如果无法预知对象确切类别及其依赖关系时
  2. 需要将类的实例化过程延迟到其子类时
  3. 工厂方法可以复用创建好的对象来节省资源(缓存)

UTOOLS1589728531095.png

所有工厂类的接口:

public interface IPhoneFactory {BasePhone createPhone();
}

具体的工厂实现类中实例化产品:

public class HonorFactory implements IPhoneFactory {@Overridepublic BasePhone createPhone() {BaseCPU cpu = new KirinFactory().createCPU();BaseCamera camera = new LeicaFactory().createCamera();return new Honor(cpu, camera);}
}
public class OnePlusFactory implements IPhoneFactory {@Overridepublic BasePhone createPhone() {BaseCPU cpu = new QualcommFactory().createCPU();BaseCamera camera = new SonyFactory().createCamera();return new OnePlus(cpu, camera);}
}

客户端只需要知道相关接口或抽象类即可,无需关心产品细节

public class Consumer {public static void main(String[] args) {BasePhone onePlus = new OnePlusFactory().createPhone();onePlus.printConfig();BasePhone honor = new HonorFactory().createPhone();honor.printConfig();}
}

GitHub | 完整代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LinkedList类源码浅析(二)

1、上一节介绍了LinkedList的几个基本的方法,其他方法类似,就不一一介绍; 现在再来看一个删除的方法:remove(Object o) remove方法接受一个Object参数,这里需要对参数做空与非空处理; 但是删除一个Object元…

2016OSC源创会年终盛典-综合技术专场-张小刚

2019独角兽企业重金招聘Python工程师标准>>> 综合技术专场 讲师/SPEAKERS 张小刚 网易云负载均衡项目负责人 《网易蜂巢负载均衡技术实践》从网易蜂巢中的实践出发,分享网易蜂巢负载均衡服务从无到有,从私有云到公有云过程中的技术实践。重点…

mysql 日期

数据类型 数据类型格式date YYYY-MM-DD datetime YYYY-MM-DD HH:MM:SS timestamp YYYY-MM-DD HH:MM:SS year YYYY 或 YY 具体实现的函数 1、now() 返回当前的日期和时间 SELECT NOW(); 2、curdate() 返回当前的日期 SELECT CURdate(); 3、curtime()返回当…

超完整的 Chrome 浏览器客户端调试大全

2019独角兽企业重金招聘Python工程师标准>>> 引言 “工欲善其事,必先利其器” 没错,这句话个人觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负…

MySQL 为什么用索引,为什么是 B+树,怎么用索引

MySQL 索引 A database index is a data structure that improves the speed of operations in a table. Indexes can be created using one or more columns, providing the basis for both rapid random lookups and efficient ordering of access to records. 为什么需要索…

Servlet 生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器&…

【Go 并发控制】上下文 context 源码

Context 在 Go 服务中,往往由一个独立的 goroutine 去处理一次请求,但在这个 goroutine 中,可能会开启别的 goroutine 去执行一些具体的事务,如数据库,RPC 等,同时,这一组 goroutine 可能还需要…

iOS开发UI篇—模仿ipad版QQ空间登录界面

一、实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的设置 (1)设置第一个控制器和自定义的控制器类(登陆)关联 (2&#xff09…

oracle中scn(系统改变号)

系统scn: select checkpoint_change# from v$database; 文件scn: select name,checkpoint_change# from v$datafile; 结束scn: select name,last_change# from v$datafile; 数据文件头部scn…

三个数相减的平方公式_快收好这份小学数学公式大全!孩子遇到数学难题时肯定用得上...

必背定义、定理公式1.三角形的面积=底高2 公式 S= ah22.正方形的面积=边长边长公式 S= aa3.长方形的面积=长宽公式 S= ab4.平行四边形的面积=底高公式 S= ah5.梯形的面积&#xff1d…

add.attribute向前端传_前端知识-概念篇

1、一次完整的HTTP事务是怎样的一个过程?基本流程:a. 域名解析b. 发起TCP的3次握手c. 建立TCP连接后发起http请求d. 服务器端响应http请求,浏览器得到html代码e. 浏览器解析html代码,并请求html代码中的资源f. 浏览器对页面进行渲…

【数据库】一篇文章搞懂数据库隔离级别那些事(LBCC,MVCC)

MySQL 事务 文章比较长,建议分段阅读 后续如果有改动会在 Junebao.top 之前对事务的了解仅限于知道要么全部执行,要么全部不执行,能背出 ACID 和隔离级别,知其然但不知其所以然,现在觉得非常有必要系统学一下&#xff…

api商品分享源码_SSM框架高并发和商品秒杀项目高并发秒杀API源码免费分享

前言:一个整合SSM框架的高并发和商品秒杀项目,学习目前较流行的Java框架组合实现高并发秒杀API源码获取:关注头条号转发文章之后私信【秒杀】查看源码获取方式!项目的来源项目的来源于国内IT公开课平台,质量没的说,很适合学习一些技术的基础,…

Golang 定时任务 github/robfig/cron/v3 使用与源码解析

Cron 源码阅读 robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式。Cron 的源码真实教科书级别的存在(可能是我菜 …),真的把低耦合高内聚体现地淋漓尽致,另外其中涉及的装饰器模式,并发处理等都很值得学习…

修改 cmd 字体为 Consolas

windows 下的 cmd 窗口默认的字体有点难看,长时间使用操作 node.js 有点小疲劳,可以修改注册表替换字体为 Consolas,并且可以全屏 cmd 窗口,代码如下: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Conso…

关于 HTTP 的一切(HTTP/1.1,HTTP/2,HTTP/3,HTTPS, CORS, 缓存 ,无状态)

HTTP 为什么会出现 HTTP 协议,从 HTTP1.0 到 HTTP3 经历了什么?HTTPS 又是怎么回事? HTTP 是一种用于获取类似于 HTML 这样的资源的 应用层通信协议, 他是万维网的基础,是一种 CS 架构的协议,通常来说&…

AS 2.0新功能 Instant Run

Instant Run上手作为一个Android开发者,很多的时候我们需要花大量的时间在bulid,运行到真机(虚拟机)上,对于ios上的Playground羡慕不已,这种情况将在Android Studio 2.0有了很大改善,使用instan…

MySQL InnoDB 是如何存储数据的

InnoDB 是怎么存储数据的 本文是《MySQL 是怎样运行的 —— 从根儿上理解 MySQL》读书总结,强烈推荐这本书; CSDN 不能显示 SVG,可能有图片加载不出来,可以到 我的博客 上看。 数据目录 众所周之,MySQL 的数据是存储在…

WebSocket实战之————GatewayWorker使用笔记例子

参考文档:http://www.workerman.net/gatewaydoc/ 目录结构 ├── Applications // 这里是所有开发者应用项目 │ └── YourApp // 其中一个项目目录,目录名可以自定义 │ ├── Events.php // 开发者只需要关注这个文件 │ ├── st…

[转]关于凸优化的一些简单概念

没有系统学过数学优化,但是机器学习中又常用到这些工具和技巧,机器学习中最常见的优化当属凸优化了,这些可以参考Ng的教学资料:http://cs229.stanford.edu/section/cs229-cvxopt.pdf,从中我们可以大致了解到一些凸优化…