定义

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。

适用场景

使用抽象工厂模式一般要满足以下条件:

系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。

系统一次只可能消费其中某一族产品,即同族的产品一起使用。

优缺点

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:

可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。

当增加一个新的产品族时不需要修改原代码,满足开闭原则。

其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

结构与实现

抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。

结构

抽象工厂模式的主要角色如下:

抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。

具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。

抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。

具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

package com.lifengdi.designpatterns.demo.abstractfactory;

/**

* 抽象工厂

* 抽象工厂(AbstractFactory)模式的定义:

* 是一种为访问类提供一个创建一组相关或相互依赖对象的接口,

* 且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

*

* 抽象工厂模式是工厂方法模式的升级版本,

* 工厂方法模式只生产一个等级的产品,

* 而抽象工厂模式可生产多个等级的产品。

*

* 抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:

* 1. 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。

* 2. 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

*

* 其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

* @author 李锋镝

* @date Create at 16:14 2019/12/16

*/

public interface AbstractFactory {

Product1 newProduct1();

Product2 newProduct2();

}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**

* @author 李锋镝

* @date Create at 16:15 2019/12/16

*/

public interface Product1 {

void show();

}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**

* @author 李锋镝

* @date Create at 16:15 2019/12/16

*/

public interface Product2 {

void show();

}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**

* @author 李锋镝

* @date Create at 16:17 2019/12/16

*/

public class AbstractFactory1Impl implements AbstractFactory {

@Override

public Product1 newProduct1() {

return () -> System.out.println("AbstractFactory1Impl newProduct1");

}

@Override

public Product2 newProduct2() {

return () -> System.out.println("AbstractFactory1Impl newProduct2");

}

}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**

* @author 李锋镝

* @date Create at 16:17 2019/12/16

*/

public class AbstractFactory2Impl implements AbstractFactory {

@Override

public Product1 newProduct1() {

return () -> System.out.println("AbstractFactory2Impl newProduct1");

}

@Override

public Product2 newProduct2() {

return () -> System.out.println("AbstractFactory2Impl newProduct2");

}

}

package com.lifengdi.designpatterns.demo.abstractfactory;

/**

* @author 李锋镝

* @date Create at 16:23 2019/12/16

*/

public class AbstractFactoryTest {

public static void main(String[] args) {

AbstractFactory abstractFactory1 = new AbstractFactory1Impl();

abstractFactory1.newProduct1().show();

abstractFactory1.newProduct2().show();

AbstractFactory abstractFactory2 = new AbstractFactory2Impl();

abstractFactory2.newProduct1().show();

abstractFactory2.newProduct2().show();

}

}

java抽象工厂模式_JAVA设计模式-抽象工厂模式相关推荐

  1. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  3. Java创新型模式_java设计模式--创建型模式(一)

    2016-04-24 10:10:34 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 注意:工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂 ...

  4. java解耦的模板模式_Java 设计模式(9) —— 模板模式

    一.模板模式 封装了一个算法步骤,并允许子类为一个或多个步骤方法提供实现.模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤. 模板模式 二.示例 泡咖啡与泡茶: 泡咖啡的步骤: 水 ...

  5. java策略模式_Java设计模式之策略模式详解

    本文实例为大家分享了Java策略模式,供大家参考,具体内容如下 1.策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern). 定义如下: Def ...

  6. java bridge 模式_Java设计模式之桥模式(Bridge模式)介绍

    Bridge定义:将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用桥模式 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  7. java模板方法模式_java设计模式(模板方法模式)

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  8. java 模板模式_java设计模式之模板模式

    模板模式 模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤.这种类型的设计模式属于 ...

  9. java 职责链模式_java设计模式-职责链模式

    模式导读: 作为一名大学生,相信我们都有过请假的经历,在我们请假是总会碰到这样的场景,就是当请假的时间超过5天(包括5天),我们的请假条就不能由班主任进行审阅通过了,而是需要上交院系,由院领导进行审阅 ...

最新文章

  1. non-member function cannot have cv-qualifier
  2. java sql 返回 json_java访问oracle 返回json 实践(一)
  3. python变量类型-Python 变量类型详解
  4. Spring的Java配置方式
  5. Python 编码风格参考
  6. 锲而不舍 —— M 是怎样找工作的?(八)
  7. 网站程序员的程序员成长之路大概分几个阶段 和未来的发展
  8. 阶乘和(信息学奥赛一本通-T1173)
  9. 如何简单区分web前后端与MVC框架
  10. 日记 [2008年03月23日]不编译内核给iptables增加模块
  11. 空间mysql数据还原_mysql通过表空间来恢复或者传递数据
  12. 计算机组成原理944考试,郑州大学2019年硕士研究生入学考试 《944计算机组成原理》考试大纲...
  13. 下列有关计算机系统叙述正确,()下列有关计算机系统软件的叙述正确的是____
  14. Mac OSX 下如何显示隐藏文件
  15. teambition 还是jira_我用过的那些测试过程管理工具TAPD、Teambition、CODING
  16. UCBCS188 AI学习笔记(1)uninformed search (无启发函数搜索)
  17. php万能播放器代码,网页视频播放器程序代码(通用代码)
  18. axios中文文档整理
  19. iOS | 地图定位
  20. 程序员亲试,人体工学椅真的有用吗?

热门文章

  1. RealSense 动态校准
  2. 数据汇总与统计(pandas库)知识点归纳总结及练习题
  3. deficit记忆_一万单词谐音记忆
  4. iverilog仿真问题
  5. 10 模拟SPI驱动PS2无线手柄
  6. centos7 pe系统安装_如何用U盘安装CentOS7系统
  7. VMware 15 上Mac虚拟机不能全屏问题的解决
  8. 【入门AUTOSAR网络管理测试】RMS-NOS状态转换
  9. C语言:使用指针,封装一个函数, // 使输入的奇数从小到大排列,奇数排列完毕之后,再把偶数从大到小进行排列, // 最终输出整个
  10. SQL 02 基础查询与排序