java 工厂模式详解_java 工厂模式的实例详解

java 工厂模式的实例详解

工厂方法中的“工厂”和我们平常理解的一样:用于生产产品。

而客户是要和产品打交道,所以工厂方法模式的意义在于把客户和产品分开,达到解耦和更灵活的目的。

一般我们有一个产品的抽象类,然后有几个具体的产品,如下:

//抽象产品角色

public interface Product{

void product();

}

//具体产品1

public class Pro1 implements Product{

@Override

public void product() {

System.out.println("产品1");

}

}

//具体产品2

public class Pro2 implements Product{

@Override

public void product() {

System.out.println("产品2");

}

}

接着客户要购买产品,他不直接和产品接触,而是使用工厂,所以我们有一个工厂:

public class Factory {

public static Product buy(type) {

switch (type) {

case 1:

return new Pro1();

case 2:

return new Pro2();

default:

break;

}

return null;

}

}

客户通过Factory .buy(type);即可购买到自己想要的产品。

————— 这就是 简单工厂模式,又称为 静态工厂方法模式。

如果新增了一款产品,我们多写一个产品类Pro3就可以了,但在工厂上我们要添加新的代码才能生产,这显然不符合“开闭原则(对扩展开放;对修改封闭)”,所以我们把工厂抽象,添加具体的工厂类,由客户选择某一个工厂,如下:

//抽象工厂

public interface Factory {

Product buy();

}

//具体工厂1

public class Factory1 implements Factory {

@Override

public Product buy() {

return new Pro1();

}

}

//具体工厂2

public class Factory2 implements Factory {

@Override

public Product buy() {

return new Pro2();

}

}

当新增了一款产品,我们多创建一个具体的工厂来生产就可以了。但是当产品种类非常多时,会出现大量的与之对应的工厂对象,这并不是我们所希望的。

——— 这就是 工厂方法模式

当产品出现多个抽象时,我们可能会有多个产品接口,这个场景就成了我们所说的

——- 抽象工厂模式

总结:

无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。 所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

以上就是java 工厂模式的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

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

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

相关文章

用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...

最近在做一个https双向认证的工作,领导先让我实现,我之前写了一篇文章,把tomcat的生成证书和配置的实现写了出来。现在领导给了我服务器的CA证书的客户端证书和私钥,服务端信任证书,分别是crt和pem格式的文件&#xff…

jmail组件 java_Jmail的主要参数列表

说明:更多的信息请参考Jmail说明,我想这已经足够用的了。(1)Body(信件正文):字符串网络说明:更多的信息请参考Jmail说明,我想这已经足够用的了。(1)Body(信件正文) : 字符串如:JMail.Body "这里可以是用户填写的…

Go -- log4go日志

折腾: 【已解决】go语言中实现log信息同时输出到文件和控制台(命令行) 期间,已经通过io的MultiWriter搞定了同时输出信息到文件和console,但是不支持level。 所以,再去试试这个log4go。 github.com/keepeye/log4go 【折…

mysql 查看索引命中_请问下如何在Mysql中where与orderBy后在命中索引?

我现在大概有一个需求,是需要在数据库中查询一个列表。数据表的样子大概是这样的:ABCDE1112016-08-0540...............而我现在的SQL语句大概是这样的SELECT * FROM TABLE WHERE B 1 AND C 1 AND D 2016-08-05 ORDER BY E DESC在这种情况下我应该怎么…

linux自动挂载windows磁盘

自动挂载配置文件: /etc/fstab 1 # /etc/fstab: static file system information.2 #3 # Use blkid to print the universally unique identifier for a4 # device; this may be used with UUID as a more robust way to name devices5 # that works even if disks …

java云开发_Java 快速开始

# Java 快速开始代码示例:点击下方按钮一键部署:# 第 1 步:编写基础应用首先我们创建一个 Spring Boot 应用。使用 curl 和 unzip 命令新建一个空 Web 项目:curl https://start.spring.io/starter.zip \-d dependenciesweb \-d ja…

首个比较成型的切图作品

花了一天的时间,跌跌撞撞完成了自己的第一个切图作品。纪念一下! https://github.com/yangpeijia/psd-html.git转载于:https://www.cnblogs.com/jiajiayang/p/6840056.html

java jar包 配置文件_java 导入jar包中配置文件

spring项目只能识别到项目内的xml配置文件,无法识别jar中xml配置文件解决思路:在启动初始化期间,将jar包内部的文件拷贝到jar包外部相对路径中。//jarFullFileName: the file name with full path in jar.//newFilePath: the new file direct…

Jmeter响应中中文乱码怎么解决?

在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成sampleresult.default.encodingUTF-8,保存,重新打开…

三星java3倍拍照手机_全世界拍照最强的两款手机,一个是三星,一个是它

原标题:全世界拍照最强的两款手机,一个是三星,一个是它要说到手机拍照,三星S7毫无疑问是现阶段公认拍照最好的安卓手机,而这很大一定程度上取决于F1.7大光圈和先进的双核对焦技术。而在最近非常火的一款国产新机OPPO R…

抽卡时下拉通知栏导致icon丢失

之前一直忙着出版本,这两天好不容易空一点,赶紧把之前的坑填一下。上次说的那个十连抽,下拉通知栏是会有icon不渲染的问题,直觉是对的是与timescale有关,按昨天的研究结果来看,是因为用了ITween.ScaleTo这个…

ie11java阻止_企业IT管理员IE11升级指南【10】—— 如何阻止IE11的安装

企业IT管理员IE11升级指南 系列:如何阻止IE11的安装希望自行管理更新计划的企业和组织可以使用 IE11 Automatic Update Blocker Toolkit (自动更新拦截工具)禁止自动更新 Internet Explorer 11,与针对 IE10、IE9、IE8 和 IE7 的阻止程序工具包一样&#…

LeetCode: Convert BST to Greater Tree

利用好BST的特性,解起来并不难 1 /**2 * Definition for a binary tree node.3 * public class TreeNode {4 * int val;5 * TreeNode left;6 * TreeNode right;7 * TreeNode(int x) { val x; }8 * }9 */ 10 public class Solution { 11 …

java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析。android的程序基于java开发,当我们接上调试器,执…

python学习之 - re模块

re模块功能:实现字符串匹配。元字符 描述\ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\\n”匹配\n。“\n”匹配换行符。序列“\\”匹配“\”而“\(”则匹配“(”。即相当于多种编程语言中都有的“转义字符”的概念。^ 匹…

java从入门到精通第11章_《Java从入门到精通》第十章学习笔记

第10章  Java集合类一、概述Java中的java.util包中提供了一些集合类,也被称为容器,不同于数组,集合的长度是可变的,存放的是对象的引用。常用的集合有List集合、Set集合、Map集合,其中List和Set实现了Collection接口…

Hive之import和export使用详解

在hive-0.8.0后引入了import/export命令。 Export命令可以导出一张表或分区的数据和元数据信息到一个输出位置,并且导出数据可以被移动到另一个hadoop集群或hive实例,并且可以通过import命令导入数据。 当导出一个分区表,原始数据可能在hdfs的…

java中抓阄_如何进行抓阄

展开全部步骤:1、设计总体中的N个个体编号。2、把号码写在号e68a84e8a2ad3231313335323631343130323136353331333431366366签上,将号签放在一个容器中搅拌均匀。3、每次从中抽取一个号签,连续不放回抽取n次。4、将取出的n个号签上所对应的n个…

ARMV8 datasheet学习笔记5:异常模型

1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32、AArch64架构下IRQ 和Data Abort 异常处理流程图对比. 3.1 IRQ 路由 3.1.1. AArch32 IRQ 路由 图 AAr…

leetcode 三数之和 python_16.leetcode题目讲解(Python):最接近的三数之和

题目如下:题目这道题可以用排一些特殊情况,减少计算量, 参考代码如下:class Solution:def threeSumClosest(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""# 如果只…