Java设计模式笔记(3)抽象工厂模式

抽象工厂模式:为创建一组相关的或者相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

package com.juno.AbstractFactoryPattern;
// 抽象产品类
public abstract class AbstractProductA {// 每个产品共有的方法public void shareMethod() {}// 每个产品相同方法,不同实现public abstract void doSomething();
}

package com.juno.AbstractFactoryPattern;
// 抽象产品类
public abstract class AbstractProductB {// 每个产品共有的方法public void shareMethod() {}// 每个产品相同方法,不同实现public abstract void doSomething();
}

package com.juno.AbstractFactoryPattern;
// 产品A1的实现类
public class ProductA1 extends AbstractProductA {@Overridepublic void doSomething() {System.out.println("产品A1的实现方法");}}

package com.juno.AbstractFactoryPattern;
// 产品A1的实现类
public class ProductA2 extends AbstractProductA {@Overridepublic void doSomething() {System.out.println("产品A2的实现方法");}}

package com.juno.AbstractFactoryPattern;
// 产品A1的实现类
public class ProductB1 extends AbstractProductB {@Overridepublic void doSomething() {System.out.println("产品B1的实现方法");}}

package com.juno.AbstractFactoryPattern;
// 产品A1的实现类
public class ProductB2 extends AbstractProductB {@Overridepublic void doSomething() {System.out.println("产品B2的实现方法");}}

package com.juno.AbstractFactoryPattern;public abstract class AbstractCreatorA {// 创建A产品家族public abstract AbstractProductA createProductA();// 创建B产品家族public abstract AbstractProductB createProductB();
}

package com.juno.AbstractFactoryPattern;public class CreatorA1 extends AbstractCreatorA{@Overridepublic AbstractProductA createProductA() {// 只生产产品等级为1的A产品return new ProductA1();}@Overridepublic AbstractProductB createProductB() {// 只生产产品等级为1的B产品return new ProductB1();}}

package com.juno.AbstractFactoryPattern;public class CreatorA2 extends AbstractCreatorA{@Overridepublic AbstractProductA createProductA() {// 只生产产品等级为2的A产品return new ProductA2();}@Overridepublic AbstractProductB createProductB() {// 只生产产品等级为2的B产品return new ProductB2();}}

package com.juno.AbstractFactoryPattern;//抽象工厂类,负责定义产品对象的产生
public abstract class AbstractCreatorB {/*** 创建一个产品A对象,其输入参数可以自行设置* 通常为String、Enum、Class等,当然也可以为空*/public abstract <T extends AbstractProductA> T createProductA(Class<T> c);/*** 创建一个产品B对象,其输入参数可以自行设置* 通常为String、Enum、Class等,当然也可以为空*/public abstract <T extends AbstractProductB> T createProductB(Class<T> c);
}

package com.juno.AbstractFactoryPattern;public class CreatorB extends AbstractCreatorB {@SuppressWarnings("unchecked")@Overridepublic <T extends AbstractProductA> T createProductA(Class<T> c) {AbstractProductA product = null;try {product = (AbstractProductA) Class.forName(c.getName()).newInstance();} catch (Exception e) {// TODO 异常处理}return (T)product;}@SuppressWarnings("unchecked")@Overridepublic <T extends AbstractProductB> T createProductB(Class<T> c) {AbstractProductB product = null;try {product = (AbstractProductB) Class.forName(c.getName()).newInstance();} catch (Exception e) {// TODO 异常处理}return (T)product;}}

package com.juno.AbstractFactoryPattern;public class Client {public static void main(String[] args) {// 定义出两个工厂AbstractCreatorA creatorA1 = new CreatorA1();AbstractCreatorA creatorA2 = new CreatorA2();// 产生A1对象AbstractProductA a1 = creatorA1.createProductA();// 产生A2对象AbstractProductA a2 = creatorA2.createProductA();// 产生A1对象AbstractProductB b1 = creatorA1.createProductB();// 产生A2对象AbstractProductB b2 = creatorA2.createProductB();a1.doSomething();a2.doSomething();b1.doSomething();b2.doSomething();System.out.println("---------------------------");AbstractCreatorB creatorB = new CreatorB();AbstractProductA a_1 = creatorB.createProductA(ProductA1.class);AbstractProductA a_2 = creatorB.createProductA(ProductA2.class);ProductB1 b_1 = creatorB.createProductB(ProductB1.class);ProductB2 b_2 = creatorB.createProductB(ProductB2.class);a_1.doSomething();a_2.doSomething();b_1.doSomething();b_2.doSomething();}
}

打印:
产品A1的实现方法
产品A2的实现方法
产品B1的实现方法
产品B2的实现方法
---------------------------
产品A1的实现方法
产品A2的实现方法
产品B1的实现方法
产品B2的实现方法













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

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

相关文章

jsoup简单的爬取网页数据

/*** Project Name:JavaTest* File Name:BankOfChinaExchangeRate.java* Package Name:com.lee.javatest* Date:2016年7月22日下午1:34:09* Copyright (c) 2016年7月22日, Pwenlee All Rights Reserved.* */package com.lee.javatest;import java.io.Serializable; import java…

sql每个月每个人的花销占比_11月:每个认真生活的人,都值得被认真对待

恍然已11月&#xff0c;风吹枯叶落&#xff0c;落叶生肥土&#xff0c;肥土滋养着果实&#xff0c;果实缓慢而坚定着成长。图片&#xff5c;东海青 摄图片&#xff5c;子夜鸟 摄11月&#xff0c;不要怂这是属木芙蓉的晚秋。花朵娇嫩&#xff0c;它却无所忌惮地美丽着&#xff0…

Java设计模式笔记(4)模版方法模式

模版方法模式&#xff1a;定义一个操作中的算法的框架&#xff0c;而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。 抽象模版的方法分为两类&#xff1a; 1. 基本方法也叫基本操作&#xff0c;是由子类实现的方法&#xff0c;并且在…

比较TFS与SVN,你必须知道的10点区别

相比SVN&#xff0c;对于TFS的优点我有以下几点看法&#xff0c;供大家参考&#xff1a; 1. 总体比较&#xff1a; TFS是一个应用软件生命周期管理&#xff08;ALM&#xff09;软件&#xff0c;是一个软件研发平台产品&#xff0c;其功能覆盖了软件研发过程中的所有环节&#…

react textarea 空格为什么不换行_你需要的 React + TypeScript 50 条规范和经验

这篇文章没有对错之分&#xff0c;肯定也有不完善的地方&#xff0c;结合了自己日常开发和经验。可以让你书写代码更具严谨性,希望看完之后有所帮助。本文字数4000 &#xff0c;看完本文大概需半小时。1. 注释(1) 文件顶部的注释&#xff0c;包括描述、作者、日期/** * descrip…

Java设计模式笔记(5)建造者模式

建造者模式&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 建造者模式的4个角色&#xff1a; Product产品类&#xff1a;通常是实现了模版方法模式&#xff0c;有模版方法和基本方法。 Builder抽象建造者&#xff1a;规…

Three.js基础探寻二——正交投影照相机

本篇主要介绍照相机中的正交投影照相机。   第一篇传送门&#xff1a;Three.js基础探寻一 1.照相机 图形学中的照相机定义了三维空间到二维屏幕的投影方式。 针对投影方式照相机分为正交投影照相机和透视投影照相机。 2.两种相机的区别与适用范围 正交投影&#xff1a; 透视投…

centos删除文件夹_等保测评主机安全之centos密码长度

密码长度&#xff0c;作为等级保护主机测评项里中密码复杂度要求之一&#xff0c;是必须要查的。在《等级测评师初级教程》里&#xff0c;对于密码长度的设置指向了/etc/login.defs里的PASS_MIN_LEN字段。# PASS_MIN_LEN Minimum acceptable password length.PASS_MIN_LEN …

【原创】Android之修改AlertDialog对话框及使用系统Holo风格

前一阵子在做伪装密码的功能&#xff0c;需要使用系统的对话框&#xff0c;对话框需要加长按事件等等。哈&#xff0c;直接上代码&#xff0c;我是比较喜欢直接看代码的。 1. 获取AlertDialog的Title final int alertTitleId getResources().getIdentifier( "alertTitle…

Activity的四种启动模式-图文并茂

1、对于使用standard 模式的活动&#xff0c;系统不会在乎这个活动是否已经在返回栈中存在&#xff0c;每次启动都会创建该活动的一个新的实例。例如A启动A&#xff0c;A再接着启动A&#xff0c;A继续启动A&#xff0c;然后再分别出栈&#xff0c;如图所示2、当活动的启动模式指…

ajax如何提交多表单的值_25 HTML5表单基本控件(二)

成长是一辈子的事儿&#xff01;大家好&#xff01;我是时问新。分享前端、Python等技术&#xff0c;以及个人成长路上的那些事儿。密码框使用标签&#xff0c;把标签上的type属性的值&#xff0c;设置为"password"&#xff0c;就可以创建密码框。密码框和单行文本框…

Java设计模式笔记(6)观察者模式

观察者模式&#xff0c;也叫发布订阅模式&#xff0c;定义对象之间的一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新。 观察者模式的几个角色&#xff1a; Subject被观察者&#xff1a;定义被观察者必须…

android_studio上传svn的时候那些不提交

buid文件夹不需要提交 转载于:https://www.cnblogs.com/YangBinChina/p/5708510.html

python语音分割_用7行Python代码构建自己的有声读物

点击关注我哦欢迎关注 “小白玩转Python”&#xff0c;发现更多 “有趣”有声读物是我们可以通过音频听取一本书或者其他作品的内容&#xff0c;是现下一种很受欢迎的阅读方式。类似的APP有&#xff1a;喜马拉雅、得到和樊登读书等。但是如果你有一本pdf格式的书籍&#xff0c;…

循环所有数据库执行脚本

这里仅仅提供一个事例&#xff0c;抛砖引玉&#xff0c;如果对您起到丁点作用&#xff0c;那是在下的荣幸 select name into #dbname from sys.databases where name like edb_a% and name not like %_dw select name,ROW_NUMBER() over (order by name asc) from #dbname d…

Java设计模式笔记(7)适配器模式

适配器模式定义&#xff1a;将一个类的接口变成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式&#xff08;Adapter Pattern&#xff09;&#xff0c;适配器模式又叫做变压器模式&#xff0c;也叫做包装模式&…

stata生成脉冲响应图怎么导出_Stata:面板VAR模型(pvar2命令)

&#x1f308;2021年寒假Stata研讨班&#xff1a;高级计量经济学及Stata应用研讨班&#x1f449;2021空间计量研讨班&#xff1a;空间计量及Geoda、Stata、ArcGis、Matlab应用PVAR这个程序最初是由Inessa Love编写的。它允许用户估计面板向量自回归和产生方差分解和脉冲响应函数…

Java设计模式笔记(8)装饰模式

装饰模式&#xff1a;动态地给一个对象添加一些额外的职责&#xff08;以对客户端透明的方式扩展对象的功能&#xff09;&#xff0c;就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活&#xff0c;是继承关系的一个替代方案。 装饰模式的四个角色&#xff1a; 抽象构…

python中的引用怎么理解_python 引用和对象理解

今天浏览博客的时候看到这么一句话&#xff1a; python中变量名和对象是分离的&#xff1b;最开始的时候是看到这句话的时候没有反应过来。决定具体搞清楚一下python中变量与对象之间的细节。&#xff08;其实我感觉应该说 引用和对象分离 更为贴切&#xff09; 从最开始的变量…

取MapString,sitemap中的全部key

Map<String,Site> siteMap conference.getSiteList(); Set<String> keyList siteMap.keySet();//得到key集合 Iterator<String> it keyList.iterator();//遍历key while(it.hasNext()){ ConfModelVsDept ConfModelVsDept new ConfModelVsDept(); String …