详谈 Java工厂 --- 抽象工厂模式
1.前言
感觉工厂模式都好鸡肋,还特别绕来绕去,当然,好处还是有的,将一些类似的业务都集成到工厂了,
不需要理会底层是怎么运行的,我只需要向调用工厂即可获取我要的结果,也不需要考虑工厂返回的东西类型,都是统一的,
操作方法也一样,但是代价是底层需要写一大堆东西,如果只是用一两次的业务,就不要构建工厂啦,我是懒得写。
什么是工厂模式?
就是为了尽可能将代码的耦合度降低而产生的设计模式。
2.总结
(1)感觉好鸡肋啊,写的还这么多,无语,就像个漏斗,当个分类器用。
(2)分两部分,工厂和 产品源 ,工厂负责打包分配的, 产品源 负责提供材料的.
(3)在产品源,
所有的材料本质上都是食物【Food接口】,往下分,可以分出苹果和面条两种【抽象类】,
抽象类实现接口,统让不同的抽象类统一了使用方法名称,同时使用java 多态 ,可以让不同的抽象类可以向上转到相同的食物类型。
再往下面分,会有各种苹果和面条【实现类】,
让实现类继承抽象类,统一了食物的使用方法名称,使用Java多态 ,可让实现类向上转类型,最终所有的食物都是归Food类型,
也就是说让不同的食物统一了类型,因此,消费者不再需要考虑这个食物需要用什么东西装,拿来能吃就行。
(4)在工厂,
工厂规定了可以吃的食物【工厂接口】,运给不同的销售地【工厂实现类】,
工厂实现类实现工厂接口,统一了对食物的操作方法,也能让不同的实现类向上转到相同的类型【工厂类型】。
我设立了摆地摊和大超市两个卖东西的地方,虽然地方不同,但是本质上都是卖食物的,根据不同的操作,
获取相应的食物【在方法里new食物对象】,不论是什么食物,本质都是食物,因此返回数据类型是Food【java多态,向最高类型转型】。
(5)消费者选择一个地点买东西,返回的都是食物工厂类型【java多态,向最高类型转型】,然后付钱【使用统一规定的操作方法获取食物】,
得到食物对象,类型都是食物,然后可以吃食物啦【对食物做统一规定的操作,由食物接口规定,如果不规定,食物多了,岂不会乱套?】
(6)因此,对消费者来说,只需要选择买东西的地方,选择要吃的食物类型,至于食物的产地,不需要在乎,能吃就行,而食物的选择是由
店主/地摊主【工厂实现类】决定,消费者给了钱,拿到了食物,就可以吃了,不需要考虑这个食物需要用什么东西装,
都统一用饭盒装【Food类型】,总不能拿个马桶盖来装吧?
(7)优点:当有新的食物,只需要添加相应的食物实现类,在可以卖该食物的工厂添加生成该食物的方法即可,如果添加了新工厂实现类,只需要实现工厂接口即可,不需改动原有的其他工厂代码。
(8)缺点:会产生很多文件,代码量也很大,绕来绕去的,容易弄错。
3.操作
(1)场景:消费者去买食物,可以去摆地摊 或 大超市够买,使用抽象工厂实现业务逻辑。
(2)目录结构
(3)食物接口
package com.example.javabaisc.factory.abstrctfactory.origin; public interface Food {
public void getFood();
}
(4)抽象类
package com.example.javabaisc.factory.abstrctfactory.origin.abstractFood; import com.example.javabaisc.factory.abstrctfactory.origin.Food; /**
* 抽象类-面条类
*/
public abstract class AbstractNoodles implements Food {
/**
* 抽象方法
*/
public abstract void getFood();
}
package com.example.javabaisc.factory.abstrctfactory.origin.abstractFood; import com.example.javabaisc.factory.abstrctfactory.origin.Food; /**
* 抽象类--苹果类
*/
public abstract class AbstractApple implements Food {
/**
* 抽象方法
*/
public abstract void getFood();
}
(5)具体食物实现类
package com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.noodles; import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.AbstractNoodles; public class YLNoodles extends AbstractNoodles {
@Override
public void getFood() {
System.out.println("一乐拉面");
}
}
package com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.noodles; import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.AbstractNoodles; public class LZNoodele extends AbstractNoodles {
@Override
public void getFood() {
System.out.println("兰州拉面");
}
}
package com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.apple; import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.AbstractApple; public class YNApple extends AbstractApple {
@Override
public void getFood() {
System.out.println("云南苹果");
}
}
package com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.apple; import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.AbstractApple; public class SDApple extends AbstractApple {
@Override
public void getFood() {
System.out.println("山东苹果");
}
}
(6)工厂接口
package com.example.javabaisc.factory.abstrctfactory.factory; import com.example.javabaisc.factory.abstrctfactory.origin.Food; /**
* 工厂接口
*/
public interface FoodFactory {
//获取苹果类食物
public Food getApple();
//获取面条类食物
public Food getNoodles(); }
(7)工厂实现类
-----摆地摊
package com.example.javabaisc.factory.abstrctfactory.factory; import com.example.javabaisc.factory.abstrctfactory.origin.Food;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.apple.SDApple;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.apple.YNApple;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.noodles.LZNoodele;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.noodles.YLNoodles; /**
* 摆地摊-工厂
*/
public class BDTFactory implements FoodFactory{ @Override
public Food getApple() {
//云南苹果
return new YNApple();
} @Override
public Food getNoodles() {
//一乐拉面
return new YLNoodles();
}
}
-----到超市
package com.example.javabaisc.factory.abstrctfactory.factory; import com.example.javabaisc.factory.abstrctfactory.origin.Food;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.apple.SDApple;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.noodles.LZNoodele;
import com.example.javabaisc.factory.abstrctfactory.origin.abstractFood.noodles.YLNoodles; /**
* 大超市-工厂
*/
public class DCSFactory implements FoodFactory{ @Override
public Food getApple() {
//山东苹果
return new SDApple();
} @Override
public Food getNoodles() {
//兰州拉面
return new LZNoodele();
}
}
(8)测试类
package com.example.javabaisc.factory.abstrctfactory; import com.example.javabaisc.factory.abstrctfactory.factory.BDTFactory;
import com.example.javabaisc.factory.abstrctfactory.factory.DCSFactory;
import com.example.javabaisc.factory.abstrctfactory.factory.FoodFactory;
import com.example.javabaisc.factory.abstrctfactory.origin.Food;
import org.junit.jupiter.api.Test; public class AbsTest {
@Test
public void t() { System.out.println("去大超市买吃的");
//去大超市买吃的
FoodFactory dcs = new DCSFactory();
//吃苹果
Food food1 = dcs.getApple();
food1.getFood();
//吃面条
Food food2 = dcs.getNoodles();
food2.getFood();
System.out.println("=================");
//
System.out.println("去摆地摊买吃的");
//去摆地摊买吃的
FoodFactory bdt = new BDTFactory();
//吃苹果
Food food3 = bdt.getApple();
food3.getFood();
//吃面条
Food food4 = bdt.getNoodles();
food4.getFood();
}
}
(9)运行测试类,打印结果
详谈 Java工厂 --- 抽象工厂模式的更多相关文章
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- Java设计模式-抽象工厂模式(Abstract Factory )
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- java 之 抽象工厂模式(大话设计模式)
看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套. 来看下类图: 大话设计模式-类图 看类图已经很乱 ...
- 2.java设计模式-抽象工厂模式
抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...
- Java设计模式-抽象工厂模式(Abstarct Factory)
抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...
- Java 实现抽象工厂模式
抽象工厂模式 里面有几个概念:抽象工厂.实体工厂.抽象产品.实体产品 抽象工厂:定义创建产品的抽象方法 实体工厂:详细的创建哪种产品 抽象产品:一个接口或基类 实体产品:实现详细功能,或派生 类图 ...
- Java设计模式——抽象工厂模式
抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...
- java 简单工厂&抽象工厂
工厂模式:就是提供一个实例化对象的接口,让子类去决定实现哪个具体对象 1:简单工厂 public abstract class Person { } public class XiaoLi exten ...
- java 使用抽象工厂封装特性方法
1.创建抽象类:封装含有相同特性的方法. */ public abstract class AbstractPayment { public abstract String progress() th ...
随机推荐
- 【力扣】123. 买卖股票的最佳时机 III
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...
- 特定场景下的PLC 远程控制和数据读取
最近有位博友提出了一种应用场景,根据工作中实际遇到的类似的产品应用场景,记录下自己的解决方案. 场景: 需要在云端控制和采集各个站点的PLC数据.各个站点是分散的,每个站点有公网访问能力,但是分散站点 ...
- Java 将Word转为OFD
通常在工作中比较常用到的Microsoft Word是属于国外的文档内容编辑软件,其编译技术均属国外.而OFD是一种我国的自主文档格式,在某些特定行业或企业的文档存储技术上是一种更为安全的选择.下面将 ...
- 一行配置搞定 Spring Boot项目的 log4j2 核弹漏洞!
相信昨天,很多小伙伴都因为Log4j2的史诗级漏洞忙翻了吧? 看到群里还有小伙伴说公司里还特别建了800+人的群在处理... 好在很快就有了缓解措施和解决方案.同时,log4j2官方也是速度影响发布了 ...
- Mysql报错合集
目录 一.链接报错 客户端连接mysql出错 链接客户端出错 交互登陆mysql出现warning警告Using a password 导入数据到数据库报错ERROR 1050 登陆数据库提示-bas ...
- centos7部署mysql-5.7
目录 一.环境声明 二.程序部署 三.更改初始密码 一.环境声明 [mysql-Server] 主机名 = host-1 系统 = centos-7.3 地址 = 1.1.1.1 软件 = mysql ...
- 使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
本文作者:黄鑫鑫 - Nocalhost 项目核心开发者 腾讯云 CODING DevOps 研发工程师.硕士毕业于中山大学数据科学与计算机学院,曾负责过平安云主机及国家超算中心容器云平台等相关业务, ...
- Pytorch入门下 —— 其他
本节内容参照小土堆的pytorch入门视频教程. 现有模型使用和修改 pytorch框架提供了很多现有模型,其中torchvision.models包中有很多关于视觉(图像)领域的模型,如下图: 下面 ...
- [BUUCTF]PWN——bbys_tu_2016
bbys_tu_2016 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况,测试时候发现输入长度过长程序会崩溃,猜测输入点存在问题 32位ida载入,检索程序里的 ...
- Java 自定义注解在登录验证的应用
java注解 从 JDK 5开始,Java 增加了注解的新功能,注解其实是代码里面的特殊标记,这些标记可以在编译.类加载和运行时被读取,在不改变代码原有逻辑下,给源文件嵌入注解信息.再通过返回获取注解 ...