Java 实现抽象工厂模式
抽象工厂模式
里面有几个概念:抽象工厂、实体工厂、抽象产品、实体产品
抽象工厂:定义创建产品的抽象方法
实体工厂:详细的创建哪种产品
抽象产品:一个接口或基类
实体产品:实现详细功能,或派生
类图
//抽象产品1
public interface IProduct1 {
public void show();
}
//抽象产品2
public interface IProduct2 {
public void show();
}
//实体产品1
public class Product1 implements IProduct1 {
public void show() {
System.out.println("创建了1型产品");
}
}
//实体产品2
public class Product2 implements IProduct2 {
public void show() {
System.out.println("创建了2型产品");
}
}
/*
* 1A 1B属于Product1 同一产品等级结构中
* 2A 2B属于Product2
*/
public class GradeProduct1A extends Product1 { @Override
public void show() {
super.show();
System.out.println("这是产品1下的:产品A");
} }
public class GradeProduct1B extends Product1 { @Override
public void show() {
super.show();
System.out.println("这是产品1下的:产品B");
}
}
public class GradeProduct2A extends Product2 { @Override
public void show() {
super.show();
System.out.println("这是产品2下的:产品A");
}
}
public class GradeProduct2B extends Product2 { @Override
public void show() {
super.show();
System.out.println("这是产品2下的:产品B");
}
}
//抽象工厂 创建不同的抽象产品
public interface IFactory {
public IProduct1 createProduct1A();//1类产品 型号A
public IProduct1 createProduct1B();//1类产品 型号B
public IProduct2 createProduct2A();//2类产品 型号A
public IProduct2 createProduct2B();//2类产品 型号B
}
//实体工厂 创建实体产品,返回类型为抽象产品
public class Factory implements IFactory { public IProduct1 createProduct1A() {
return new GradeProduct1A();
} public IProduct1 createProduct1B() {
return new GradeProduct1B();
} public IProduct2 createProduct2A() {
return new GradeProduct2A();
} public IProduct2 createProduct2B() {
return new GradeProduct2B();
}
}
/*
* 抽象工厂模式:用来创建一组相关或者相互依赖的对象
*
* 流程:抽象工厂,实体工厂 生产产品
* 抽象产品。实体产品 实现产品功能
* 缺点:当须要添加一个产品(由抽象和实体构成)。工厂都须要更改
*/
public class Test4Abstract {
public static void main(String[] args) {
IFactory factory = new Factory();
IProduct1 product1a = factory.createProduct1A();
product1a.show();
IProduct1 product1b = factory.createProduct1B();
product1b.show(); IProduct2 product2a = factory.createProduct2A();
product2a.show();
IProduct2 product2b = factory.createProduct2B();
product2b.show();
}
}
Java 实现抽象工厂模式的更多相关文章
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- Java设计模式-抽象工厂模式(Abstract Factory )
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- java 之 抽象工厂模式(大话设计模式)
看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套. 来看下类图: 大话设计模式-类图 看类图已经很乱 ...
- 2.java设计模式-抽象工厂模式
抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...
- Java设计模式-抽象工厂模式(Abstarct Factory)
抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...
- Java设计模式——抽象工厂模式
抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
随机推荐
- 实例化Class类的5种方式
Java的数据类型可以分为两类,即引用类型和原始类型.对于每种类型的对象,Java虚拟机会实例化不可变的java.lang. Class对象.它提供了在运行时检查对象属性的方法,这些属性包括它的成员和 ...
- java web 学习笔记 - jsp用的文件上传组件 SmartUpload
---恢复内容开始--- 1. SmartUpload 此控件在jsp中被广泛的使用,而FileUpload控件主要是用在框架中 2. 如果想要使用,需要在tomcat的lib目录中,将SmartUp ...
- CSS:div/img水平垂直居中
div水平垂直居中方法一: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- videojs
<link href="http://vjs.zencdn.net/5.5.3/video-js.css" rel="stylesheet"> &l ...
- 爬虫之pyquery库
官方文档:https://pyquery.readthedocs.io/en/latest/ PyQuery是一个强大又灵活的网页解析库.如果你觉得正则写起来太麻烦.BeautifulSoup语法太难 ...
- linux time-统计给定命令所花费的总时间
推荐:更多linux 性能监测与优化 关注:linux命令大全 time命令用于统计给定命令所花费的总时间. 语法 time(参数) 参数 指令:指定需要运行的额指令及其参数. 实例 当测试一个程序或 ...
- Journals in Fluid Mechanics
journal of fluid mechanics physics of fluids annual review of fluid mechanics
- 封装的一些常见的JS DOM操作和数据处理的函数.
//用 class 获取元素 function getElementsByClass(className,context) { context = context || document; if(do ...
- 工作用linux命令汇总
mv [filepath] [filepath] 移动,前者位置移动到后面位置,也可以用来重命名(mv test.txt newname.txt) cp [filepath] [filepath] 复 ...
- 定时任务-----Springboot中使用Scheduled做定时任务----http://www.cnblogs.com/lirenqing/p/6596557.html
Springboot中使用Scheduled做定时任务---http://www.cnblogs.com/lirenqing/p/6596557.html 已经验证的方案: pom文件加入依赖 < ...