实例详解JAVA抽象工厂模式
时间:2022-04-20 [网络编程]作者:fabuyuan 浏览:8 次
推荐学习:《java视频教程》
什么是抽象工厂模式
抽象工厂(AbstractFactory)模式的定义: 是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
满足条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
优点:
可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
缺点:
- 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
抽象工厂的实现
案例的主要角色如下:
抽象工厂(Abstract Factory): 七侠传承
工厂(SimpleFactory): 师傅、师娘
抽象产品(Product): 天外陨石(铸剑的原材料)、一窝灵鸽蛋(未孵化的灵鸽)
具体产品(ConcreteProduct): 七剑。七只灵鸽
案例:
师傅拥有七侠传承,会打造至阳之剑和培养雄性小灵鸽。
师娘拥有七侠传承,会打造至阴之剑和培养雌性小灵鸽。
七侠找师傅师娘打造自己的剑和领养自己的小灵鸽。
抽象产品、产品
S1接口(天外陨石):
接口内声明了一个方法
public interface S1 { void show();}
S2接口(一窝灵鸽蛋):
接口内声明了一个方法
public interface S2 { void show();}
A1类实现接口S1(长虹剑):
实现S1接口
public class A1 implements S1 { @Override public void show() { System.out.println("打造了一把长虹剑"); }}
B1类实现接口S1(冰魄剑):
实现S1接口
public class B1 implements S1 { @Override public void show() { System.out.println("打造了一把冰魄剑"); }}
C1类实现接口S1(紫云剑):
实现S1接口
public class C1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
D1类实现接口S1(雨花剑):
实现S1接口
public class D1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
E1类实现接口S1(青光剑):
实现Ss接口
public class E1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
F1类实现接口S1(奔雷剑):
实现Ss接口
public class F1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
G1类实现接口S1(旋风剑):
实现Ss接口
public class G1 implements S1 { @Override public void show() { System.out.println("打造了一把紫云剑"); }}
A2类实现接口S2(灵鸽一号):
实现S1接口
public class A2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
B2类实现接口S2(灵鸽二号):
实现S1接口
public class B2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
C2类实现接口S2(灵鸽三号):
实现S1接口
public class C2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
D2类实现接口S2(灵鸽四号):
实现S1接口
public class D2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
E2类实现接口S2(灵鸽五号):
实现Ss接口
public class E2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
F2类实现接口S2(灵鸽六号):
实现Ss接口
public class F2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
G2类实现接口S2(灵鸽七号):
实现Ss接口
public class G2 implements S2 { @Override public void show() { System.out.println("灵鸽七号"); }}
抽象工厂、工厂
Zz接口(七侠传承):
接口内声明了一个铸剑方法abc1()和一个养鸽子方法abc2()
public interface Zz { S1 abc1(String a); S2 abc2(String a);}
Nan类实现接口Zz(师傅):
实现Zz接口
public class Nan implements Zz { private static S1 s1; private static S2 s2; public S1 abc1(String a) { if ("长虹剑".equals(a)) { s1 = new A1(); } else if ("奔雷剑".equals(a)) { s1 = new F1(); } else if ("青光剑".equals(a)) { s1 = new E1(); } else if ("雨花剑".equals(a)) { s1 = new D1(); } else if ("旋风剑".equals(a)) { s1 = new G1(); } else { System.out.println("铸剑失败"); } return s1; } public S2 abc2(String a) { if ("灵鸽一号".equals(a)) { s2 = new A2(); } else if ("灵鸽二号".equals(a)) { s2 = new F2(); } else if ("灵鸽三号".equals(a)) { s2 = new E2(); } else if ("灵鸽四号".equals(a)) { s2 = new D2(); } else if ("灵鸽五号".equals(a)) { s2 = new G2(); } else { System.out.println("领养失败"); } return s2; }}
Nv类实现接口Zz(师娘):
实现Zz接口
public class Nv implements Zz { private static S1 s1; private static S2 s2; public S1 abc1(String a) { if ("冰魄剑".equals(a)) { s1 = new B1(); } else if ("紫云剑".equals(a)) { s1 = new C1(); } else { System.out.println("铸剑失败"); } return s1; } public S2 abc2(String a) { if ("灵鸽六号".equals(a)) { s2 = new B2(); } else if ("灵鸽七号".equals(a)) { s2 = new C2(); } else { System.out.println("领养失败"); } return s2; }}
测试
测试类:
public class Demo { public static void main(String[] args) { System.out.println("---------至阳传承-------------"); //师傅 Nan nan = new Nan(); //造剑 S1 a1 = nan.abc1("长虹剑"); S1 d1 = nan.abc1("雨花剑"); S1 e1 = nan.abc1("青光剑"); S1 f1 = nan.abc1("奔雷剑"); S1 g1 = nan.abc1("旋风剑"); //养鸽子 S2 a2 = nan.abc2("灵鸽一号"); S2 d2 = nan.abc2("灵鸽二号"); S2 e2 = nan.abc2("灵鸽三号"); S2 f2 = nan.abc2("灵鸽四号"); S2 g2 = nan.abc2("灵鸽五号"); a1.show(); d1.show(); e1.show(); f1.show(); g1.show(); a2.show(); d2.show(); e2.show(); f2.show(); g2.show(); System.out.println("---------至阴传承-------------"); //女铸剑师 Nv nv = new Nv(); S1 b1 = nv.abc1("冰魄剑"); S1 c1 = nv.abc1("紫云剑"); b1.show(); c1.show(); S2 b2 = nv.abc2("灵鸽六号"); S2 c2 = nv.abc2("灵鸽七号"); b2.show(); c2.show(); }}
推荐学习:《java视频教程》
以上就是实例详解JAVA抽象工厂模式的详细内容,更多请关注站长家园其它相关文章!
本文标签: java
转载请注明来源:实例详解JAVA抽象工厂模式
本文永久链接地址:https://www.adminjie.com/post/11351.html
免责声明:
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
附:
二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!
版权声明:
一、本站致力于为软件爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的部分源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、我站提供用户下载的所有内容均转自互联网。如有内容侵犯您的版权或其他利益的,若有侵犯你的权益请:提交版权证明文件到邮箱 2225329873#qq.com(#换为@) 站长会进行审查之后,情况属实的会在三个工作日内为您删除。
更多精彩内容
- VUE中V-IF条件判断改变元素的样式操作
- Discuz如何解决安装时报错run_sql_error
- 低版本VS项目在VS2019无法正常编译的问题
- PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
- Oracle数据库的实例/表空间/用户/表之间关系简单讲解
- RSA2是啥?PHP-RSA2签名验证怎么实现?
- 华为dubal20是什么型号
- ana an00华为是什么型号
- 电脑显示信号线无连接是什么意思
- app是什么应用程序的简称
- html5中onclick是什么意思
- html5的标题标记一共有几个等级
- 我国自行设计研制的银河II型计算机是什么
- 小程序大小超限除了分包还能怎么做?如何避免和解决大小限制?
- vivov1818a是什么手机型号

- 最新文章
-
-
oracle的用户权限有哪些
oracle的用户权限:1、系统权限,允许用户执行特定的数据库动作的权限,包括了创建表、索引、连接实例等等;2、对象权限,允许用户操作特定对象的权限,包括了读取...
-
php怎么用正则匹配某个字符并删除
两种方法:1、用preg_replace()将匹配字符替换为空字符,语法“preg_replace('/指定字符/i','',$str)”。2、用preg_fi...
-
JavaScript面向对象详细解析之属性描述符
本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下...
-
php怎么去掉指定字符之后的内容
两种方法:1、用“substr_replace($str,"",strpos($str,"指定字符")+1)”语句,将指定字符位置后的内容替换为空字符;2、用“...
-
php怎么不四舍五入的保留一位小数
方法:1、利用“*”运算符将小数扩大10倍,语法“$a=小数*10;”,将小数点向后移一位;2、用floor()对扩大后的小数向下取整,舍去小数部分,语法“$b...
-
- 热门文章
-
-
VUE中V-IF条件判断改变元素的样式操作
这篇文章主要介绍了VUE中V-IF条件判断改变元素的样式操作,具有很好的参考价值,希望对大家有所帮助。一起跟随想过来看看吧...
-
Discuz如何解决安装时报错run_sql_error
问题环境VMware虚拟机Centos7.3PHP7.0MySQL8.0NGINX1.14Discuz3.4问题还原本地环境为PHP5.6+MySQL5.6在安...
-
低版本VS项目在VS2019无法正常编译的问题
低版本VS项目在VS2019无法正常编译的问题这里指的编译并不准确,只是为了方便说明。后有(未安装),201?...
-
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
实现原理使用redis链表来做,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用。实现步骤第一步,先将商品库存入队列/**.trigge...
-
Oracle数据库的实例/表空间/用户/表之间关系简单讲解
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例。Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。我们用这些高级权限账号...
-