java 抽象工厂模式简单实例

抽象工厂模式:提供一个创建一系列的相关的或者依赖的对象的接口,无需指定它们的具体实现类,具体的时间分别在子类工厂中产生。

类似于工厂模式:隔离了具体类的生产实现,使得替换具体的工厂实现类很容易。包含有以下模块:

1.抽象产品接口:定义产品的接口,公共的暴露方法。便于实际的产品类实现。

2.具体的产品类:包含实际产品的类的逻辑处理:

3.抽象工厂接口:定义产生系列对象的接口

4.具体的工厂实现:实现抽象的接口工厂,返回具体的产品类的实现。

下面是具体的代码示例:

1.抽象的产品接口,定义了Car 和 IBreakFast

package factory.simple;/*** 抽象产品角色 交通工具接口* * @author lilin* */
public interface Car {/*** 上班函数*/void gotowork();}

 

package factory.abstractfactory;/*** @author lilin* */
public interface IBreakFast {/*** 吃早餐*/void eat();
}

2.定义具体的产品类的实现:

package factory.simple;/*** 具体产品角色,自行车* * @author lilin* */
public class Bike implements Car {@Overridepublic void gotowork() {System.out.println("骑自行车去上班!");}}

 

package factory.simple;/*** @author lilin* */
public class Bus implements Car {@Overridepublic void gotowork() {System.out.println("坐公交车去上班!");}}

 

/*** */
package factory.abstractfactory;/*** @author lilin* */
public class Milk implements IBreakFast {@Overridepublic void eat() {System.out.println("喝牛奶!");}}

 

/*** */
package factory.abstractfactory;/*** @author lilin* */
public class Orange implements IBreakFast {@Overridepublic void eat() {System.out.println("吃橘子!");}}

3.定义好抽象的工厂接口,一系列的获取实例的接口方法:

/*** */
package factory.abstractfactory;import factory.simple.Car;/*** @author lilin* */
public interface IAbstractFactory {/*** * @return*/Car getCar();/*** */IBreakFast getBreakFast();}

4.定义具体的工厂生产类,具体的产品实例返回。

/*** */
package factory.abstractfactory;import factory.simple.Bike;
import factory.simple.Car;/*** @author lilin* */
public class LowPersonFactory implements IAbstractFactory {@Overridepublic Car getCar() {return new Bike();}@Overridepublic IBreakFast getBreakFast() {return new Orange();}}

 

/*** */
package factory.abstractfactory;import factory.simple.Bus;
import factory.simple.Car;/*** @author lilin* */
public class HighPersonFactory implements IAbstractFactory {@Overridepublic Car getCar() {return new Bus();}@Overridepublic IBreakFast getBreakFast() {return new Milk();}
}

 

最后,通过testNG简单测试下,抽象工厂模式的实现:代码如下:

/*** */
package factory.abstractfactory;import org.testng.annotations.Test;import factory.simple.Car;/*** @author lilin* */
public class AbstractFactoryTest {@Testpublic void test() {IAbstractFactory factory = new LowPersonFactory();Car car = factory.getCar();IBreakFast breakFast = factory.getBreakFast();System.out.println("吃的早饭是:");breakFast.eat();System.out.println("上班交通工具是:");car.gotowork();IAbstractFactory factory2 = new HighPersonFactory();car = factory2.getCar();breakFast = factory2.getBreakFast();System.out.println("吃的早饭是:");breakFast.eat();System.out.println("上班交通工具是:");car.gotowork();}}

这样使用过程城中,只要注入抽象的工厂接口,具体的产品的产生,会在实际的子类工厂类中产生,也可以随意的添加和修改实际子类工厂类,而不需要改变既有的代码设计。

抽象工厂方法:一般常常使用于一套程序,需要多套实现的场景之下。

 

转载于:https://www.cnblogs.com/lilin0719/p/5313886.html

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

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

相关文章

图像处理之积分图应用三(基于NCC快速相似度匹配算法)

from:https://blog.csdn.net/jia20003/article/details/53021614 图像处理之积分图应用三(基于NCC快速相似度匹配算法) 基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测…

深入浅出地理解机器人手眼标定

from:https://blog.csdn.net/qq_16481211/article/details/79764730 所谓手眼系统,就是人眼镜看到一个东西的时候要让手去抓取,就需要大脑知道眼镜和手的坐标关系。如果把大脑比作B,把眼睛比作A,把手比作C,如果A和B的…

centos 6.5 安装 mongodb

官方给出的链接地址:https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 安装后重要的日志 win10 上使用mongochef连接不上数据库 解决方案: 修改 /etc/mongod.conf 将bindIP 改为0.0.0.0 监听外网转载于:https://www.cnblogs.com/l…

scala学习资料

1. scala-sbt 构建工具: http://www.scala-sbt.org/0.13/docs/zh-cn/Directories.html 2. 资料: http://www.ibm.com/developerworks/cn/java/j-lo-funinscala2/ https://www.zhihu.com/question/34548588?sortcreated http://nerd-is.in/2013-09/scala…

opencv3/C++ 机器学习-SVM应用实例:药品(胶囊)识别与分类

from:https://blog.csdn.net/akadiao/article/details/79278072 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/akadiao/article/details/79278072 问题描述: 现对6种不同颜色药品(胶囊…

Elasticsearch 搜索不到数据问题(_mapping 设置)

需求 由于 kibana3 中,不支持直接在请求的 url 中设置搜索的 type (是不是我不知道???)。 为了支持特定 type 的搜索,所以我设置了个下每个 panel 的查询语句,让它增加一个&#xff…

SVM之交叉验证【转】

交叉验证(CrossValidation)方法思想简介 以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进…

linux命令学习-1-less

less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less …

python问题汇总

问题1:如何解决python3中numpy报错No module named numpy 打开terminal pip3 install numpy 问题2:ModuleNotFoundError No module named matplotlib 打开terminal pip3 install matplotlib

jspspy database help

.转载于:https://www.cnblogs.com/outline/p/5316051.html

SVM 调参策略

转自:SVM 调参策略:https://blog.csdn.net/u014484783/article/details/78220646 SVM 怎样能得到好的结果 1. 对数据做归一化(simple scaling) 2. 应用 RBF kernel 3. 用cross-validation和grid-search 得到最优的c和g 4. 用…

美好的⼀天 从ActionTab开始 美观、智能、⾼效的新标签⻚ iTab 新标签页iTab新标签页Atop100工具推荐

文章目录 ActionTabiTab 新标签页iTab新标签页,小组件,起始页,标签页,日历,股票,浏览器扩展 https://www.actiontab.cn/ ActionTab 收费???? iTab 新标签页iT…

Oracle学习之merge

--使用merge语句 create table new as select * from emp where 10; insert into new (empno,ename) select empno,ename from emp where deptno10;merge into new n using emp e on (n.empnoe.empno) when matched then update set n.sale.salwhen not matched then insert (…

机器学习中的算法(2)-支持向量机(SVM)基础

from:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/18/2034566.html 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleastgm…

HDU 2586 How far away ?【LCA】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid2586 题意: 无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次。给定询问,求询问的结点之间的距离。 分析&#xff1…

深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

from:https://blog.csdn.net/xianlingmao/article/details/7919597 在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求…

android一些若干回调测试

1.activity:onAttachedToWindow在onResume后回调 2.onCreate和onResume调用间隔为29ms, onAttachedToWindow和OnResume相差11ms, viewTreeObserver:OnGloballayout和onAttachedtoWindow相差19ms 注:以上的测试时间间隔不能保证精确相同,但是可以从中看出…

Kinect深度图与摄像头RGB的标定与配准(转载文章)

作者原文地址:http://blog.csdn.net/aichipmunk/article/details/9264703 自从有了Kinect,根据深度图提取前景就非常方便了。因此出现了很多虚拟现实、视频融合等应用。但是,Kinect自身的RGB摄像头分辨率有限,清晰度也不及一些专业…

台北到淡水版Firefox无法播放视频

台北到淡水版的Firefox所有的视频都无法播放,禁用了各种插件也还是没法播放,最后才确定是SWF的问题,大家有同样问题的,可以下载我的放到SWF文件夹下,目录结构如下图: ​Firefox的SWF下载地址1 ​Firefox的S…

最详细、最完整的相机标定讲解

相机标定详解 最近做项目要用到标定,因为是小白,很多东西都不懂,于是查了一堆的博客,但没有一个博客能让我完全能看明白整个过程,绝大多数都讲的不全面,因此自己总结了一篇博客,给自己理一下思…